Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振找不到正确的提供程序<;集团>;导航到不同路线后_Flutter_Dart_Flutter Provider_Flutter Bloc - Fatal编程技术网

Flutter 颤振找不到正确的提供程序<;集团>;导航到不同路线后

Flutter 颤振找不到正确的提供程序<;集团>;导航到不同路线后,flutter,dart,flutter-provider,flutter-bloc,Flutter,Dart,Flutter Provider,Flutter Bloc,我正在使用bloc来处理注册表单的状态。但我得到了一个错误: 错误:在此BlocBuilder小部件上方找不到正确的提供程序 正如您在错误中看到的,我确实使用了blocCreateDidBloc和stateCreateDidState并通过BlocBuilder获取它们。 BlocBuilder位于我的“注册”页面中,在我的例子中,该页面称为创建。当我从介绍页面导航到创建页面时,会发生此错误。 下面是我的MaterialApp摘录,其中我使用RepositoryProvider和BlocProv

我正在使用bloc来处理注册表单的状态。但我得到了一个错误:
错误:在此BlocBuilder小部件上方找不到正确的提供程序

正如您在错误中看到的,我确实使用了bloc
CreateDidBloc
和state
CreateDidState
并通过BlocBuilder获取它们。
BlocBuilder位于我的“注册”页面中,在我的例子中,该页面称为
创建
。当我从介绍页面导航到创建页面时,会发生此错误。
下面是我的
MaterialApp
摘录,其中我使用
RepositoryProvider
BlocProvider
包装创建页面,以便创建页面可以访问Bloc和存储库。但是由于某种原因,
创建
页面在导航到创建页面后没有找到
CreateDidBloc
的BlocProvider

initialRoute: "/introduction",
routes: {
  "/introduction": (context) => Introduction(),
  "/create": (context) => RepositoryProvider(
        create: (context) => CreateDidRepository(),
        child: BlocProvider(
          create: (BuildContext context) => CreateDidBloc(
            repo: context.read<CreateDidRepository>(),
          ),
          child: Creation(),
        ),
      ),
},
创建(注册)页面:


我找到了BlocBuilder在导航后找不到
CreateDidBloc
的原因。发生该错误的原因是,在颤振中导航会将页面推到小部件树中MaterialApp的正下方。这意味着我新导航的页面位于BlocProvider之上,BlocProvider在MaterialApp下面的小部件树中指定。
为了解决这个问题,我只是用MultiBlocProvider和RepositoryProvider包装了我的MaterialApp,这样无论我采用何种路线,Bloc都可以在全球范围内提供。
这是我可以全局定义集团的重要摘录:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RepositoryProvider(
        create: (context) => CreateDidRepository(),
        child: MultiBlocProvider(
            providers: [
              BlocProvider<LanguageBloc>(
                  create: (context) =>
                      LanguageBloc(LanguagePreference.getLanguage())),
              BlocProvider<CreateDidBloc>(
                  create: (context) =>
                      CreateDidBloc(repo: context.read<CreateDidRepository>()))
            ],
            child: BlocBuilder<LanguageBloc, LanguageState>(
              builder: (context, state) {
                return MaterialApp(...)
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回存储提供程序(
create:(context)=>CreateDidRepository(),
子对象:MultiBlocProvider(
供应商:[
BlocProvider(
创建:(上下文)=>
LanguageBloc(LanguagePreference.getLanguage()),
BlocProvider(
创建:(上下文)=>
CreateDidBloc(repo:context.read())
],
孩子:BlocBuilder(
生成器:(上下文、状态){
返回材料PP(…)
@override
Widget build(BuildContext context) {
  return SafeArea(
      child: Scaffold(
          body: Column(
    children: [
      Expanded(
        child: PageView(
          physics: const NeverScrollableScrollPhysics(),
          controller: _pageController,
          onPageChanged: (index) {
            setState(() => currentStep = index);
          },
          children: [
            Step1(),
            Step2(),
            Step3(),
          ],
        ),
      ),
      Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          BlocBuilder<CreateDidBloc, CreateDidState>(
            builder: (context, state) {
              return ElevatedButton(
                  onPressed: () {
                    next();
                  },
                  child: Text(L.of(context).next));
            },
          ),
          BlocBuilder<CreateDidBloc, CreateDidState>(
            builder: (context, state) {
              return OutlinedButton(
                  onPressed:
                      state.formStatus is FormSubmitting ? null : cancel,
                  child: Text(L.of(context).back));
            },
          )
        ],
      ),
      const SizedBox(
        height: 16,
      )
    ],
  )));
}
When the exception was thrown, this was the stack
#0      Provider._inheritedElementOf
#1      Provider.of
#2      ReadContext.read
#3      _BlocBuilderBaseState.initState
#4      StatefulElement._firstBuild
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RepositoryProvider(
        create: (context) => CreateDidRepository(),
        child: MultiBlocProvider(
            providers: [
              BlocProvider<LanguageBloc>(
                  create: (context) =>
                      LanguageBloc(LanguagePreference.getLanguage())),
              BlocProvider<CreateDidBloc>(
                  create: (context) =>
                      CreateDidBloc(repo: context.read<CreateDidRepository>()))
            ],
            child: BlocBuilder<LanguageBloc, LanguageState>(
              builder: (context, state) {
                return MaterialApp(...)