抛出 providernotfoundexception(t, context.widget.runtimetype);

throw providernotfoundexception(t, context.widget.runtimetype);

我正在学习 flutter,并决定使用 cubit 开发待办事项列表应用程序。我在主屏幕中使用 bloc 提供程序创建了一个肘,在另一个屏幕中我试图直接使用相同的肘而不创建另一个。

主屏幕 cubit 部分和使用 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(

我有一个指向第二页的按钮:

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

在第二页上,我试图在不使用 bloc 提供程序的情况下使用 cubit。当我以某种方式使用 bloc 提供程序时,我无法访问数据库中的数据,我必须再次调用创建数据库。

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;
  }

您是否尝试过使用 BlocProvider.value() 小工具?

例如:

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => BlocProvider.value(
      value: BlocProvider.of<appcubit>(context)
      child: cattaskview(),
    )
  )
);

我通过在 material app

之前创建 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);
       }));
 }
}