0

私はフラッターを学んでおり、cubit を使用して todo リスト アプリケーションに取り組むことにしました。ホーム画面でブロックプロバイダーを使用してキュービットを作成し、別の画面で別のキュービットを作成せずに同じキュービットを直接消費しようとしています。

ホームスクリーン cubit セクションと cubit を使用したデータベースの作成:

ここでキュービットを作成し、データベースを作成しました。

class Homescreen extends StatelessWidget {
  const Homescreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => appcubit()..CreateDatabase(),
      child: BlocConsumer<appcubit, appStates>(
        listener: (context, state) {
          // ignore: todo
          // TODO: implement listener
        },
        builder: (context, state) {
          appcubit cubit = appcubit.get(context);

          return Scaffold(

2 番目のページに移動するボタンがあります。

Widget buildTaskCat(tasknum, cat, progress, context) {
  return InkWell(
    onTap: () {
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => cattaskview(
            cat: cat,
            progress: progress,
            tasknum: tasknum,
          ),
        ),
      );
    },

2 番目のページでは、ブロック プロバイダーを使用せずに cubit を消費しようとしています。ブロックプロバイダーを使用すると、データベース内のデータにアクセスできなくなり、データベースの作成を再度呼び出す必要があります。

class cattaskview extends StatelessWidget {
  const cattaskview(
      {Key? key,
      required this.cat,
      required this.tasknum,
      required this.progress})
      : super(key: key);
  final String cat;
  final int tasknum;
  final double progress;

  @override
  Widget build(BuildContext context) {
    return BlocConsumer<appcubit, appStates>(
      listener: (context, state) {
        // TODO: implement listener
      },
      builder: (context, state) {
        return Scaffold(

実行しようとすると、このエラーメッセージが表示されます

if (inheritedElement == null && null is! T) {
      throw ProviderNotFoundException(T, context.widget.runtimeType);
    }

    return inheritedElement;
  }
4

2 に答える 2

0

材料アプリの前にcubitを作成して問題を修正しました

void main() {
 Bloc.observer = MyBlocObserver();
 runApp(const Todo());
}

class Todo extends StatelessWidget {
 const Todo({Key? key}) : super(key: key);

 @override
 Widget build(BuildContext context) {
   return BlocProvider(
       create: (context) => appcubit()..CreateDatabase(),
       child: BlocConsumer<appcubit, appStates>(listener: (context, state) {
         // TODO: implement listener
       }, builder: (context, state) {
         return MaterialApp(
             theme: ThemeData(
               appBarTheme: const AppBarTheme(
                 systemOverlayStyle: SystemUiOverlayStyle(
                   statusBarColor: Colors.transparent,
                   statusBarIconBrightness: Brightness.light,
                 ),
               ),
             ),
             home: Homescreen(),
             debugShowCheckedModeBanner: false);
       }));
 }
}

于 2021-10-08T02:29:10.473 に答える