flutter - BLoC:如何通过呢?

标签 flutter dart bloc flutter-provider

我想知道通过 Bloc 的最佳方式。我阅读了有关 bloc 提供程序的信息,但是使用它们与仅在构造函数中传递 bloc 之间有什么区别,例如:

ExampleView X = ExampleView(bloc,...)

实际上,我发现这种方式更容易测试,也是保持代码更简洁的更好方式。例如,如果我有更多的 bloc,就会发生这样的事情:

XBlocProvider(
                  bloc: XBloc,
                  child: YBlocProvider(
                      bloc: Y,
                      child: ZBlocProvider...
                    )

也许这只是我缺乏知识。 那么,有哪些好处呢?

最佳答案

这个问题:

ExampleView X = ExampleView(bloc,...)

只有当您将 bloc 用作带有一些 Stream\ValueNotifier 的普通类/提供者时才有意义。否则会有一些问题。

如果是global bloc,通过它是比较费力的方式。您应该在 MaterialApp 之上使用 XBlocProvider

顺便说一句,如果它是全局/顶级 Bloc ,您可以这样做:

XBlocProvider(
  bloc: xBloc, // Singleton
  child XPage,
...

这样,您就可以从应用程序的任何位置访问此 bloc,并且您还可以收听

如果是本地 bloc,因为我们通过 InheritedWidgetupdateShouldNotify 方法监听 BlocChangeNotifierProvider ,作为 constructor 传递是没有意义的,因为您不能按预期直接使用它。您需要将该实例放入 BlocProvider 中并再次使用它,所以这是额外的工作。

https://api.flutter.dev/flutter/widgets/InheritedWidget/updateShouldNotify.html

要克服多重嵌套的 BlocProvider,您可以使用 MultiProviderMultiBlocProvider

例子:

MultiBlocProvider(
  providers: [
    XProvider(...),
    YProvider(...),
    ZProvider(...),
  ],
  child: someWidget,
)

有多种传递方式取决于您的需要,但不要担心 InheritedWidget,因为它是获取您的 XBlocProvider 的非常快速和方便的方式。

最后,尝试理解每一种方法,我特别建议你掌握这篇文章:

https://www.didierboelens.com/2018/12/reactive-programming---streams---bloc---practical-use-cases/

您会了解何时将 bloc 与提供者一起使用或作为单例或像您的示例一样实例化等。

关于flutter - BLoC:如何通过呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56163563/

相关文章:

firebase - 如何检查 Field 是否存在于 firestore 数据库的文档中?

flutter - snackbar 的持续时间和高度

dart - 如何在 Flutter 中创建带有底部彩色边框的 AppBar?

dart - Dart2JS 如何将 Dart 函数转换为 JS 函数?

flutter - Equatable 的子类将什么传递给 super (Equatable 类)?

flutter - 如何在 flutter 中使用 hydated_bloc 保持状态?

flutter - Flutter 中 Raised 按钮类的 hoverColor 属性,不会改变吗?

dart - 没有声明顶级 getter <className>

firebase - 在Snapshot.data.length flutter中定义Firestore文档的数量

即使在事件重新触发后 Flutter BlocListener 也只执行一次