我想知道通过欧盟的最佳方式。我读到了有关集团提供商的文章,但是使用它们和仅仅在构造函数中传递组有什么不同:
ExampleView X = ExampleView(bloc,...)实际上,我发现这种方法更容易测试,也是保持代码更干净的更好方法。例如,如果我有更多的区块,这样的事情就会发生:
XBlocProvider(
bloc: XBloc,
child: YBlocProvider(
bloc: Y,
child: ZBlocProvider...
)也可能是因为我缺乏知识。那么,哪些是好处呢?
发布于 2019-05-16 13:18:48
问题是:
ExampleView X = ExampleView(bloc,...)只有当您将集团作为普通类/提供程序与某些Stream\ValueNotifier一起使用时,才有意义。否则它会有一些问题。
如果它是全球集团,它是更累人的方式通过它。您应该在XBlocProvider之上使用MaterialApp。
顺便说一句,如果是全球/顶级集团,您可以这样做:
XBlocProvider(
bloc: xBloc, // Singleton
child XPage,
...这样,您可以从应用程序的任何位置访问该集团,也可以访问listen。
如果它是本地的,因为我们通过Bloc或ChangeNotifierProvider通过InheritedWidget的updateShouldNotify方法收听updateShouldNotify,那么传递为constructor是没有意义的,因为您不能按照您的意愿直接使用它。您需要将这个实例放入BlocProvider中,然后再使用它,所以这是额外的工作。
https://api.flutter.dev/flutter/widgets/InheritedWidget/updateShouldNotify.html
要克服多个嵌套的BlocProvider,可以使用MultiProvider或MultiBlocProvider。
示例:
MultiBlocProvider(
providers: [
XProvider(...),
YProvider(...),
ZProvider(...),
],
child: someWidget,
)有多种传递方式取决于您的需要,但是不要担心InheritedWidget,因为它是获取XBlocProvider的非常快捷和方便的方法。
最后,试着理解每一种方法,我特别建议你抓住这篇文章:
https://www.didierboelens.com/2018/12/reactive-programming---streams---bloc---practical-use-cases/
您将知道什么时候与提供程序一起使用You,或者作为单个实例使用,或者像您的示例那样实例化等等。
发布于 2019-05-16 09:25:16
第一个不同之处是如何从小部件中访问集团。
bloc实现,您必须通过Provider获得它,后者使用context扩展了InheritedWidget,例如:final xBloc = Provider.of<XBloc>(context);更重要的是,当您用bloc包装BlocProvider时,bloc的作用域仅限于这个小部件的子树,因此只能由BlocProvider的后代访问。
发布于 2019-05-16 09:30:15
不必在构造函数中传递组成员是使用提供程序的好处。它通过在InheritedWidget的帮助下向小部件树传播信息,从而降低了应用程序的复杂性。您所需要的只是使用BlocProvider.of(context)从子部件访问这个组。
https://stackoverflow.com/questions/56163563
复制相似问题