【问题标题】:throw providernotfoundexception(t, context.widget.runtimetype);抛出 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;
  }

【问题讨论】:

    标签: flutter bloc state-management cubit


    【解决方案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);
           }));
     }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2011-04-14
      • 2020-01-04
      相关资源
      最近更新 更多