我想知道通过集团的最佳方法。我读过有关bloc提供程序的信息,但是使用它们和将bloc传递给构造函数的区别是什么?
ExampleView X = ExampleView(bloc,...)
实际上,我发现这种方法更易于测试,同时也是保持代码更清洁的更好方法。例如,如果我有更多的集团,可能会发生以下情况:
XBlocProvider(
bloc: XBloc,
child: YBlocProvider(
bloc: Y,
child: ZBlocProvider...
)
或者也许只是我缺乏知识。 那么,有哪些好处呢?
答案 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)
第一个区别是您如何从小部件访问您的集团。
bloc
实现,您已经通过扩展Provider
的{{1}}获得了它
例如使用InheritedWidget
:context
当您将final xBloc = Provider.of<XBloc>(context);
与bloc
包装在一起时,BlocProvider
的范围仅限于此小部件的子树,因此只能由bloc
来访问后裔。
答案 2 :(得分:0)
使用提供程序的好处是不必在构造函数中传递bloc。通过使您能够借助InheritedWidget沿小部件树向下传播信息,它降低了应用程序的复杂性。您只需要使用BlocProvider.of(context)
从子窗口小部件访问块。