我有这样的代码:

MultiBlocProvider(
  providers: [
    BlocProvider(
      create: (context) => CubitExample(),
    ),
  ],
  child: MaterialApp(
    home: Home(),
  ),
);

它工作得很好,我有很多块,所以我决定将提供者列表移到一个单独的类中:

MultiBlocProvider(
  providers: BlocProviders.blocs(),
  child: MaterialApp(
    home: Home(),
  ),
);

// The class 
class BlocProviders {
  static List<BlocProvider> blocs() {
    return <BlocProvider>[
      BlocProvider(
        create: (context) => CubitExample(()),
      ),
    ];
  }
}

现在抛出常见的阻塞错误:

ProviderNotFoundException (Error: Could not find the correct Provider<ExampleCubit> above this BlocBuilder<ExampleCubit, ExampleState> Widget

我不知道为什么当我try 第二个代码时会抛出错误,为什么会抛出错误?

推荐答案

我想我设法得到了一些见解,

每当我们用MultiBlocProvider包装一个小部件时,我们都会给出其中的提供者列表以及一个子小部件.

所以我研究了MultiBlocProvider的实现,我发现它接受BlocProviderSingleChildWidget类型的List,并且它是在SingleChildWidget 上定义的Mixin,这意味着我们不能使用List.

现在,在您的示例中,您按如下方式定义了小部件类:

MultiBlocProvider(
  providers: BlocProviders.blocs(),
  child: MaterialApp(
    home: Home(),
  ),
);

你的BLOC类是这样的:

class BlocProviders {
  static List<BlocProvider> blocs() {
    return <BlocProvider>[
      BlocProvider(
        create: (context) => CubitExample(()),
      ),
    ];
  }
}

在这里,您已经创建了类型为List<BlocProvider>的列表,它不是BlocProviderSingleChildWidget.因此,它向您显示了您正在谈论的错误.

一个人用getter方法回答了这个问题,而不是静态函数,它起作用了,因为他没有给列表赋予任何类型(它是动态的),因此错误消失了.

现在,如果您想要像您提到的那样使用您的类和函数,您可以通过如下所示的动态类型来使用它:

class BlocProviders {
  static blocs() {
    return [
      BlocProvider(
        create: (context) => CubitExample(),
      ),
    ];
  }
}

希望它解决了你所有的问题和相关的问题.此外,如果您想了解它,可以查看MultiBlocProvider的实现.

Flutter相关问答推荐

如何使用新的Riverpod语法将依赖传递给AsyncNotifier?

在Flutter 中将参数从一个类传递到另一个类

如果文档确实存在,则FiRestore将";False";返回到";if-Document-Existes";...还是我说错了?

Flutter 布局-全屏幕容器

Ffmpeg_kit_fltter:^6.0.3版权问题

如何管理枚举类型的阻塞事件?

Riverpod 2.0-如何使用FutureOr和AutoDisposeSyncNotificationer处理api状态代码?

Flutter中不使用Container是否可以做margin

无法在 Flutter 项目中安装最新版本的 image_picker

尽管海拔设置为 0,如何删除 appBar 下的下划线

Flutter 使用扩展的 TextField 定位小部件

无法在 ListView (Flutter) 中限制 Card 的最大宽度

不使用 GlobalKey 仍然收到 GlobalKey 被多次使用的错误

如何正确地将 PageView 设置为 AppBar 的标题?

Elevated 和 Outlined 按钮之间的动画

Flutter/Dart - 从外部类更新状态

Flutter使Perspective Page View无限循环

在 flutter 的另一个类中使用变量值

Android: 从 URI 获取音频元数据

Flutter:当我通过 Transform.rotate 旋转水平 ListView 时,左右边缘被切断