BLoC:如何通过?

时间:2019-05-16 07:54:27

标签: dart flutter provider bloc

我想知道通过集团的最佳方法。我读过有关bloc提供程序的信息,但是使用它们和将bloc传递给构造函数的区别是什么?

ExampleView X = ExampleView(bloc,...)

实际上,我发现这种方法更易于测试,同时也是保持代码更清洁的更好方法。例如,如果我有更多的集团,可能会发生以下情况:

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

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

3 个答案:

答案 0 :(得分:2)

此问题:

ExampleView X = ExampleView(bloc,...)

您每次需要实例化BLoC时,都会丢失旧会话中的所有数据,这也将增加CPU的成本。

仅当您的集团仅与一个特定页面连接,但通常需要静态BLoC时,此方法才有效。这就是我们使用InheritedWidget的原因,因为Flutter将所有InheritedWidgets保留在内存中。使用这种方法,您可以实例化一次并在任何地方使用,而不会丢失任何会话,这在性能方面也很有效。当然,您可以使用单身人士,但这样做不会结交任何朋友:)

方法太多,但Flutter团队刚刚宣布他们建议使用此软件包:https://pub.dev/packages/provider

如果您不希望级联巨大的树,可以使用此软件包注入这样的多个块:

MultiProvider(
  providers: [
    Provider<Foo>.value(value: foo),
    Provider<Bar>.value(value: bar),
    Provider<Baz>.value(value: baz),
  ],
  child: someWidget,
)

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

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

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

答案 1 :(得分:0)

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

  • 当您通过构造函数传递它时,您可以直接访问它
  • 那么当您使用BlocProvider时,大多数情况下取决于您的 bloc实现,您已经通过扩展Provider的{​​{1}}获得了它 例如使用InheritedWidget
context

当您将final xBloc = Provider.of<XBloc>(context); bloc包装在一起时,BlocProvider的范围仅限于此小部件的子树,因此只能由bloc来访问后裔。

答案 2 :(得分:0)

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