BLoC:如何通过?

Lit*_*key 5 dart flutter bloc flutter-provider

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

ExampleView X = ExampleView(bloc,...)
Run Code Online (Sandbox Code Playgroud)

实际上,我发现这种方式更易于测试,也是保持代码更清晰的更好方式。例如,如果我有更多的块,可能会发生这样的事情:

XBlocProvider(
                  bloc: XBloc,
                  child: YBlocProvider(
                      bloc: Y,
                      child: ZBlocProvider...
                    )
Run Code Online (Sandbox Code Playgroud)

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

Ese*_*met 6

这个问题:

ExampleView X = ExampleView(bloc,...)
Run Code Online (Sandbox Code Playgroud)

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

如果是全球集团,通过它的方式更令人筋疲力尽。您应该XBlocProviderMaterialApp.

顺便说一句,如果它是全球/顶级集团,你可以这样做:

XBlocProvider(
  bloc: xBloc, // Singleton
  child XPage,
...
Run Code Online (Sandbox Code Playgroud)

这样,您可以从应用程序的任何地方访问这个块,也可以listen

如果它是本地块,因为我们监听的方式BlocChangeNotifierProviderviaInheritedWidgetupdateShouldNotify方法,pass as 没有意义, constructor 因为你不能按照你的意图直接使用它。您需要将该实例放入其中BlocProvider并再次使用它,因此这是额外的工作。

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

要克服多嵌套BlocProviders,您可以使用MultiProviderMultiBlocProvider

例子:

MultiBlocProvider(
  providers: [
    XProvider(...),
    YProvider(...),
    ZProvider(...),
  ],
  child: someWidget,
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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