我的 Flutter 应用程序有多个 BloC(通过bloc and 颤振块包)这导致了一些技术困难,我使用解决方法解决了这些问题,但我想知道是否有更好的解决方案。
我在用块构建器()当监听一个块时,每个块都有自己的 BlocBuilder() 调用。首先,我嵌套 BlocBuilder() 调用,如下所示:
Widget build(BuildContext context) {
return BlocBuilder (
bloc: bloc1,
builder: (ctx, snapshot1) {
do_something1(snapshot1);
return BlocBuilder(ctx2, snapshot2) {
bloc: bloc2,
builder: (ctx2, snapshot2) {
do_something2(snapshot2);
return renderWidget();
}
}
}
);
}
我对这个嵌套 BlocBuilder() 调用遇到的问题是,如果 bloc1 有数据进入,则 bloc2 的 BlocBuilder() 将被重新调用,导致 bloc2 的当前状态被重新 read() 并导致 do_something2 遇到困难() 理想情况下,仅当 bloc2 有新数据时才应调用它。
所以我所做的是为每个 BlocBuilder() 调用创建一个单独的小部件,从而产生以下新的 build():
Widget build(BuildContext context) {
return Column(
children: [
WidgetBlocBuilder1(),
WidgetBlocBuilder2(),
renderWidget(),
],
);
}
这样做的作用是,传入 bloc1 或 bloc2 的任何数据都将分别本地化在 WidgetBlocBuilder1() 或 WidgetBlocBuilder2() 中,更重要的是,传入的 bloc 数据不会导致另一个 bloc 的 BlocBuilder() 被重新调用( )就像我的嵌套 BlocBuilder() 方法中的情况一样。
这是 WidgetBlocBuilder1() 的 build():
Widget build(BuildContext context) {
return BlocBuilder(
bloc: bloc,
builder: (ctx, snapshot) {
if (snapshot is CommandEditorSaveFile) {
_saveDocumentFile(ctx);
}
return Visibility(
child: Text('test'),
visible: false,
);
},
);
}
请注意,WidgetBlocBuilder1() 是一个不可见的小部件,如 Visibility(visible:false) 包装器所示。这是因为小部件本身不应该在屏幕上呈现任何内容;该小部件只是 BlocBuilder() 调用的包装器。如果传入的块数据应该更改父窗口小部件的可见状态,则需要编写逻辑来实现它。
这个解决方法似乎有效,但我想知道是否有更好的解决方案。
任何建议将不胜感激。
/何塞利托