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

Posted

技术标签:

【中文标题】抛出 providernotfoundexception(t, context.widget.runtimetype);【英文标题】:throw providernotfoundexception(t, context.widget.runtimetype); 【发布时间】:2021-11-27 23:57:26 【问题描述】:

我正在学习 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 提供程序的情况下消耗肘位。当我以某种方式使用 bloc 提供程序时,我无法访问数据库中的数据,我必须再次调用 create database。

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;
  

【问题讨论】:

【参考方案1】:

您是否尝试过使用BlocProvider.value() 小部件?

例如:

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

【讨论】:

执行此操作时仍然出现错误:BlocProvider.of() called with a context that does not contain a appcubit. 【参考方案2】:

我通过在材料应用程序之前创建肘部解决了这个问题

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


【讨论】:

以上是关于抛出 providernotfoundexception(t, context.widget.runtimetype);的主要内容,如果未能解决你的问题,请参考以下文章

Android 上的 Google Ads API 客户端引发 ProviderNotFoundException

如何在小部件测试中测试特定的 ProviderNotFoundException

ProviderNotFoundException(错误:在此主页小部件上方找不到正确的 Provider<EntryProvider>

SpringSecurity 提示ProviderNotFoundException: No AuthenticationProvider found for ****

用户身份验证失败时的 Spring Security ProviderNotFoundException

为啥我们不能只抛出异常/可抛出而不是有多个异常[重复]