BLoC:如何通过呢?

BLoC: how to pass it?

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

ExampleView X = ExampleView(bloc,...)

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

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

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

第一个区别是您如何从小部件访问您的集团。

  • 当您通过构造函数传递它时,您可以直接访问它
  • 当你使用 BlocProvider 时,在大多数情况下取决于你的 bloc 实现,您已通过扩展 InheritedWidgetProvider 获得它 使用 context 例如:
final xBloc = Provider.of<XBloc>(context);

更重要的是,当您用 BlocProvider 包裹 bloc 时,您的 bloc 的范围仅限于此小部件的子树,因此它只能由 BlocProvider的后代。

不必在构造函数中传递 bloc 是使用提供程序的好处。它使您能够在 InheritedWidget 的帮助下沿着小部件树传播信息,从而降低了应用程序的复杂性。您只需要使用 BlocProvider.of(context) 从子小部件访问 bloc。

这个问题:

ExampleView X = ExampleView(bloc,...)

只有当你正常使用你的集团 class/provider 和一些 Stream\ValueNotifier 时才有意义。否则会有一些问题。

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

顺便说一句,如果是global/top级集团,你可以这样做:

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

通过这种方式,您可以从应用程序的任何位置访问此集团,您也可以 listen 它。

如果是本地集团,因为我们通过 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 与提供者一起使用或作为单例或实例化(如您的示例等)使用。