6

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

ExampleView X = ExampleView(bloc,...)

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

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

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

4

3 回答 3

7

这个问题:

ExampleView X = ExampleView(bloc,...)

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

如果它是全球集团,那么通过它会更费力。您应该XBlocProviderMaterialApp.

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

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

这样,您可以从应用程序的任何位置访问此块,您也可以访问listen它。

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

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

要克服多嵌套BlocProvider的 s,您可以使用MultiProvideror MultiBlocProvider

例子:

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

有多种方法可以通过取决于您的需要,但不要担心,InheritedWidget因为它是获取您的XBlocProvider.

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

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

您将了解何时将 bloc 与提供程序一起使用或作为单例或实例化(如您的示例等)。

于 2019-05-16T13:18:48.697 回答
1

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

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

更重要的是,当您包装您的时blocBlocProviderbloc的范围仅限于此小部件的子树,因此只能由BlocProviders 后代访问。

于 2019-05-16T09:25:16.520 回答
0

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

于 2019-05-16T09:30:15.900 回答