BLoC:如何通过呢?
BLoC: how to pass it?
我想知道通过集团的最佳方式。我阅读了有关 bloc 提供程序的信息,但是使用它们与仅在构造函数中传递 bloc 之间有什么区别,例如:
ExampleView X = ExampleView(bloc,...)
实际上我发现这种方式更容易测试,也是保持代码更简洁的更好方式。例如,如果我有更多的区块,就会发生这样的事情:
XBlocProvider(
bloc: XBloc,
child: YBlocProvider(
bloc: Y,
child: ZBlocProvider...
)
也许这只是我缺乏知识。
那么,有哪些好处呢?
第一个区别是您如何从小部件访问您的集团。
- 当您通过构造函数传递它时,您可以直接访问它
- 当你使用 BlocProvider 时,在大多数情况下取决于你的
bloc
实现,您已通过扩展 InheritedWidget
的 Provider
获得它
使用 context
例如:
final xBloc = Provider.of<XBloc>(context);
更重要的是,当您用 BlocProvider
包裹 bloc
时,您的 bloc
的范围仅限于此小部件的子树,因此它只能由 BlocProvider
的后代。
不必在构造函数中传递 bloc 是使用提供程序的好处。它使您能够在 InheritedWidget 的帮助下沿着小部件树传播信息,从而降低了应用程序的复杂性。您只需要使用 BlocProvider.of(context)
从子小部件访问 bloc。
这个问题:
ExampleView X = ExampleView(bloc,...)
只有当你正常使用你的集团 class/provider 和一些 Stream\ValueNotifier
时才有意义。否则会有一些问题。
如果是global bloc,通过它会比较费力。您应该在 MaterialApp
之上使用 XBlocProvider
。
顺便说一句,如果是global/top级集团,你可以这样做:
XBlocProvider(
bloc: xBloc, // Singleton
child XPage,
...
通过这种方式,您可以从应用程序的任何位置访问此集团,您也可以 listen
它。
如果是本地集团,因为我们通过 InheritedWidget
的 updateShouldNotify
方法收听 Bloc
或 ChangeNotifierProvider
的方式,传递为没有意义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/
您会了解何时将 bloc 与提供者一起使用或作为单例或实例化(如您的示例等)使用。
我想知道通过集团的最佳方式。我阅读了有关 bloc 提供程序的信息,但是使用它们与仅在构造函数中传递 bloc 之间有什么区别,例如:
ExampleView X = ExampleView(bloc,...)
实际上我发现这种方式更容易测试,也是保持代码更简洁的更好方式。例如,如果我有更多的区块,就会发生这样的事情:
XBlocProvider(
bloc: XBloc,
child: YBlocProvider(
bloc: Y,
child: ZBlocProvider...
)
也许这只是我缺乏知识。 那么,有哪些好处呢?
第一个区别是您如何从小部件访问您的集团。
- 当您通过构造函数传递它时,您可以直接访问它
- 当你使用 BlocProvider 时,在大多数情况下取决于你的
bloc
实现,您已通过扩展InheritedWidget
的Provider
获得它 使用context
例如:
final xBloc = Provider.of<XBloc>(context);
更重要的是,当您用 BlocProvider
包裹 bloc
时,您的 bloc
的范围仅限于此小部件的子树,因此它只能由 BlocProvider
的后代。
不必在构造函数中传递 bloc 是使用提供程序的好处。它使您能够在 InheritedWidget 的帮助下沿着小部件树传播信息,从而降低了应用程序的复杂性。您只需要使用 BlocProvider.of(context)
从子小部件访问 bloc。
这个问题:
ExampleView X = ExampleView(bloc,...)
只有当你正常使用你的集团 class/provider 和一些 Stream\ValueNotifier
时才有意义。否则会有一些问题。
如果是global bloc,通过它会比较费力。您应该在 MaterialApp
之上使用 XBlocProvider
。
顺便说一句,如果是global/top级集团,你可以这样做:
XBlocProvider(
bloc: xBloc, // Singleton
child XPage,
...
通过这种方式,您可以从应用程序的任何位置访问此集团,您也可以 listen
它。
如果是本地集团,因为我们通过 InheritedWidget
的 updateShouldNotify
方法收听 Bloc
或 ChangeNotifierProvider
的方式,传递为没有意义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/
您会了解何时将 bloc 与提供者一起使用或作为单例或实例化(如您的示例等)使用。