Flutter 在 BlocConsumer Widget 上方找不到正确的 Provider

Nit*_*Sai 3 flutter bloc flutter-bloc

我正在Flutter Bloc一个项目中使用。

这是结构:

      MultiBlocProvider(
          providers: [
            BlocProvider<BlocA>(
              create: (context) {
                return BlocA()
                  ..add(FetchEvent());
              },
            ),
            BlocProvider<BlocC>(
              create: (context) {
                return BlocC()..add(FetchEvent());
              },
            ),
          ],
          child: IndexedStack(
            index: _pageNum,
            children: [
              ChildA(),
              ChildB(),
            ],
          ),
        )
Run Code Online (Sandbox Code Playgroud)

里面ChildB我有 aNavigator.push()到 a ChildCBlocC正在使用 ( BlocConsumer),但我收到错误,

Flutter could not find the correct Provider above BlocConsumer<BlocC> Widget
Run Code Online (Sandbox Code Playgroud)

编辑 有一个按钮可以在按下时ChildB导航到。ChildC喜欢,

TextButton( // this code exists inside a scaffold widget
   child: Text("Page C"),
   onPressed: () {
      Navigator.push(context, CupertinoPageRoute(builder: (context) => ChildC()));
   }
), 
Run Code Online (Sandbox Code Playgroud)

这是集团消费者ChildC

Flutter could not find the correct Provider above BlocConsumer<BlocC> Widget
Run Code Online (Sandbox Code Playgroud)

编辑2

我找到了这个答案,显然,这是使用时的问题Navigator.push。不过,如果有人知道如何解决我的情况,请告诉我

Val*_*nal 6

提供者是有范围的。这意味着只有您的提供者的子树(您的子小部件)可以访问它。当您推送新页面时,它会将其推送到MaterialApp路由器(应用程序的默认根路由器),并且您的小部件树如下所示:

MaterialApp
 |- Provider
 |   |- TextButton (with onPressed: () => Navigator.push())
 |- ChildC
Run Code Online (Sandbox Code Playgroud)

如您所见,您的ChildC不在Provider(s) 下方。


1. 将您的提供商移至材料应用程序之上

解决这个问题的一种方法是将您的提供商移至您的之上MaterialApp

Provider
 |- MaterialApp
 |   |- TextButton (with onPressed: () => Navigator.push())
 |   |- ChildC
Run Code Online (Sandbox Code Playgroud)

2.使用嵌套路由器

您可以将页面推送到位于以下位置的嵌套路由器Provider

MaterialApp
 |- Provider
 |   |- Router
 |   |  |- TextButton (with onPressed: () => Navigator.push())
 |   |  |- ChildC
Run Code Online (Sandbox Code Playgroud)

3. 再次提供您的BlockC上述信息ChildC

MaterialApp
 |- Provider
 |   |- TextButton (with onPressed: () => Navigator.push())
 |- ChildC
Run Code Online (Sandbox Code Playgroud)