【问题标题】:Flutter could not find the correct Provider above BlocConsumer WidgetFlutter 在 BlocConsumer Widget 上方找不到正确的 Provider
【发布时间】:2021-09-29 13:37:18
【问题描述】:

我在一个项目中使用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(),
            ],
          ),
        )

ChildB 内部,我有一个Navigator.push() 到一个ChildC,其中BlocC 正在使用(BlocConsumer),但我收到了一个错误,

Flutter could not find the correct Provider above BlocConsumer<BlocC> Widget

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

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

这是ChildC中的集团消费者

// Child C
 Scaffold(
      body: BlocConsumer<BlocC, CState>(
        builder: (context, state) {
          if(state is CSuccessState) {
            return _body();
          } else if (state is CLoadingState || state is CInitState) {
            return Center(child: CircularProgressIndicator());
          } else return Center(child: Text("Something went wrong"));
        },
        listener: (context, state) {},

      ),
    );

编辑 2

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

【问题讨论】:

  • 能贴出BlocConsumer的代码吗?
  • 您导航到使用 BlocC 的子 C?你能提供你导航到 ChildC 的部分吗
  • 一个可能的原因是 ChildC 不在 MultiBlocProvider 树内,在这种情况下,请考虑将您的 bloc 提供者移到更高的范围

标签: flutter bloc flutter-bloc


【解决方案1】:

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

MaterialApp
 |- Provider
 |   |- TextButton (with onPressed: () => Navigator.push())
 |- ChildC

如您所见,您的ChildC 不低于Provider


1.将您的提供者移到您的材料应用之上

解决它的一种方法是将您的提供者移到您的 MaterialApp 之上:

Provider
 |- MaterialApp
 |   |- TextButton (with onPressed: () => Navigator.push())
 |   |- ChildC

2.使用嵌套路由器

您可以将您的页面推送到您的Provider 下方的嵌套路由器:

MaterialApp
 |- Provider
 |   |- Router
 |   |  |- TextButton (with onPressed: () => Navigator.push())
 |   |  |- ChildC

3.再次提供您的BlockC 以上ChildC

TextButton( // this code exists inside a scaffold widget
   child: Text("Page C"),
   onPressed: () {
      final blockCValue = context.read<BlockC>();
      Navigator.push(
        context,
        CupertinoPageRoute(builder: (context) => Provider<BlockC>.value(
          value: blockCValue,
          child: ChildC(),
        ),
      );
   },
), 

【讨论】:

    【解决方案2】:

    导航器的行为是预期的。

    你应该替换 Navigator.push(context, CupertinoPageRoute(builder: (context) =&gt; ChildC()));

    Navigator.push(context, CupertinoPageRoute(builder: (ctx) => BlocProvider.value(value: context.read<BlocC>()), child: ChildC());
    

    这会起作用。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2021-09-20
      • 2021-07-16
      • 2021-12-19
      • 2021-04-29
      • 2020-11-28
      • 2021-09-15
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多