flutter 在< WelcomeBloc>此BlocBuilder&lt;WelcomeBloc,WelcomeState&gt; Widget上找不到正确的提供程序

tjjdgumg  于 7个月前  发布在  Flutter
关注(0)|答案(1)|浏览(60)

我解决了错误类型不匹配,但现在另一个异常被抛出
The argument type 'List' can't be assigned to the parameter type 'List'
这是控制台输出
在构建Welcome(state:_WelcomeState#276b6)时引发了以下ProviderNotFoundException:Error:Could not find correct Provider above this BlocBuilder<WelcomeBloc,WelcomeState> Widget
这是因为您使用的BuildContext不包含您选择的提供程序。有几种常见情况:

  • 您在main.dart中添加了新提供程序并执行了热重新加载。若要修复,请执行热重新启动。
  • 您尝试读取的提供程序位于不同的路由中。

提供者是有作用域的。所以如果你在一个路由中插入一个提供者,那么其他路由将不能访问这个提供者。

  • 您使用的BuildContext是您尝试读取的提供程序的祖先。

确保BlocBuilder<WelcomeBloc,WelcomeState>位于MultiProvider/Provider下。这通常发生在您创建提供程序并试图立即读取它时。
例如,而不是:

Widget build(BuildContext context) {
  return Provider<Example>(
    create: (_) => Example(),
    // Will throw a ProviderNotFoundError, because `context` is associated
    // to the widget that is the parent of `Provider<Example>`
    child: Text(context.watch<Example>().toString()),
  );
}

字符串
考虑使用builder如下:

Widget build(BuildContext context) {
  return Provider<Example>(
    create: (_) => Example(),
    // we use `builder` to obtain a new `BuildContext` that has access to the provider
    builder: (context, child) {
      // No longer throws
      return Text(context.watch<Example>().toString());
    }
  );
}


相关的导致错误的小部件是
欢迎页面。dart:19
当抛出异常时,这就是堆栈。
这是我修改后的主.dart文件

Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: AppPages.allBlocProviders(context) ,
      child: ScreenUtilInit(
      builder: (context, child) {
          return MaterialApp(
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
              appBarTheme: const AppBarTheme(
                iconTheme: IconThemeData(
                  color: AppColors.primaryText
                ),
                elevation: 0,
                backgroundColor: Colors.white
              )
            ),
            onGenerateRoute: AppPages.GenerateRouteSettings,
          );
        },
      )
    );
  }


这是我的欢迎. dart 文件.

return  BlocBuilder<WelcomeBloc, WelcomeState>(
      builder: (context, state) {
        return Container(
          color: Colors.white,
          child: Scaffold(
            body: Container(
              margin: EdgeInsets.only(top: 34.h),
              width: 375.w,
              child: Stack(
                alignment: Alignment.topCenter,
                children: [
                  PageView(
                    controller: pageController,
                    onPageChanged: (value) {
                      state.page = value;
                      BlocProvider.of<WelcomeBloc>(context).add(WelcomeEvent());
                      // print(value);
                    },
                    children: [
                      _page(
                        1,
                        context,
                        "Next",
                        "First See Learning",
                        "Forget about a for of paper all knowledge in on learning",
                        "assets/images/reading.png"
                      ),
                      _page(
                        2,
                        context,
                        "Next",
                        "Connect With Everyone",
                        "Always keep in touch with your tutor & friend, Let's get connected",
                        "assets/images/boy.png"
                      ),
                      _page(
                        3,
                        context,
                        "Get Started",
                        "Always Fascinated Learning",
                        "Anywhere, anytime, The time is at our direction so study whenever you want",
                        "assets/images/man.png"
                      ),
                    ],
                  ),
                  Positioned(
                    bottom: 100.h,
                    child: DotsIndicator(
                      position: state.page,
                      dotsCount: 3,
                      mainAxisAlignment: MainAxisAlignment.center,
                      decorator: DotsDecorator(
                        color: AppColors.primaryThirdElementText,
                        activeColor: AppColors.primaryElement,
                        size: const Size.square(8.0),
                        activeSize: const Size(18.0, 8.0),
                        activeShape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(5.0)
                        )
                      ),
                    )
                  )
                ],
              ),
            ),
          ),
        );
      },
    );
  }


这是我修改过的页面。dart文件

static List<PageEntity> routes (){
    return [
      PageEntity(
      route: AppRoutes.INITIAL, 
      page: const Welcome(), 
      bloc: BlocProvider(create: (context)=>WelcomeBloc(),)
    ),
      PageEntity(
      route: AppRoutes.SING_IN, 
      page: const SignInPage(), 
      bloc: BlocProvider(create: (context)=>SignInBlocs(),)
    ),
      PageEntity(
      route: AppRoutes.REGISTER, 
      page: const Register(), 
      bloc: BlocProvider(create: (context)=>RegisterBlocs(),)
    ),
    ];
  }

// return all the bloc providers
   static List<BlocProvider> allBlocProviders(BuildContext context){
    List<BlocProvider> blocProviders = <BlocProvider>[];
    for(var blocs in routes()){
      if(blocs.bloc != null){
        blocProviders.add(blocs.bloc!);
      }
    }
    return blocProviders;
  }

  // model that cover entire screen as we click on navigator object
  static MaterialPageRoute GenerateRouteSettings(RouteSettings settings){
    if(settings.name !=null){
      // check for route name matching when navigator gets triggered.
      var result = routes().where((element) => element.route == settings.name);
      if(result.isNotEmpty){
        return MaterialPageRoute(builder: (_)=> result.first.page, settings: settings);
      }
    }
    return MaterialPageRoute(builder: (_)=> const SignInPage(), settings: settings);
  }
}

class PageEntity{
  String route;
  Widget page;
  BlocProvider? bloc;

  PageEntity({required this.route, required this.page,  this.bloc});
}


我怎么处理这个错误。我累了,但找不到解决办法。

ncecgwcz

ncecgwcz1#

看起来没什么问题,你能提供一个例子给我调试吗?

相关问题