Lit*_*key 5 dart flutter bloc flutter-provider
我想知道通过集团的最佳方式。我读到了 bloc 提供者,但是使用它们与仅在构造函数中传递 bloc 之间有什么区别,例如:
ExampleView X = ExampleView(bloc,...)
Run Code Online (Sandbox Code Playgroud)
实际上,我发现这种方式更易于测试,也是保持代码更清晰的更好方式。例如,如果我有更多的块,可能会发生这样的事情:
XBlocProvider(
bloc: XBloc,
child: YBlocProvider(
bloc: Y,
child: ZBlocProvider...
)
Run Code Online (Sandbox Code Playgroud)
或者也许这只是我缺乏知识。那么,有哪些好处呢?
这个问题:
ExampleView X = ExampleView(bloc,...)
Run Code Online (Sandbox Code Playgroud)
只有当您将您的集团用作普通类/提供者时,才有意义Stream\ValueNotifier
。否则它有一些问题。
如果是全球集团,通过它的方式更令人筋疲力尽。您应该XBlocProvider
在MaterialApp
.
顺便说一句,如果它是全球/顶级集团,你可以这样做:
XBlocProvider(
bloc: xBloc, // Singleton
child XPage,
...
Run Code Online (Sandbox Code Playgroud)
这样,您可以从应用程序的任何地方访问这个块,也可以listen
。
如果它是本地块,因为我们监听的方式Bloc
或ChangeNotifierProvider
viaInheritedWidget
的updateShouldNotify
方法,pass as 没有意义, constructor
因为你不能按照你的意图直接使用它。您需要将该实例放入其中BlocProvider
并再次使用它,因此这是额外的工作。
https://api.flutter.dev/flutter/widgets/InheritedWidget/updateShouldNotify.html
要克服多嵌套BlocProvider
s,您可以使用MultiProvider
或MultiBlocProvider
。
例子:
MultiBlocProvider(
providers: [
XProvider(...),
YProvider(...),
ZProvider(...),
],
child: someWidget,
)
Run Code Online (Sandbox Code Playgroud)
有多种传递方式取决于您的需要,但不要担心,InheritedWidget
因为这是一种非常快速和方便的方式来获取您的XBlocProvider
.
最后,尝试理解每一种方法,我特别建议您掌握这篇文章:
https://www.didierboelens.com/2018/12/reactive-programming---streams---bloc---practical-use-cases/
您将了解何时将 bloc 与提供程序一起使用,或者作为单例使用,或者像您的示例一样实例化等。