我的 Flutter 应用程序有多个 BloC(通过 bloc 和 flutter_bloc 包),这导致了一些我使用变通方法解决的技术困难,但我想知道是否有是更好的解决方案。
我正在使用 BlocBuilder() 来收听一个 bloc,其中每个 bloc 都有自己的 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 的当前状态被重新读取()并导致do_something2() 的困难,理想情况下应该只在有 bloc2 的新数据时调用。
所以我所做的是为每个 BlocBuilder() 调用创建一个单独的小部件,从而产生以下新的 build():
Widget build(BuildContext context) {
return Column(
children: [
WidgetBlocBuilder1(),
WidgetBlocBuilder2(),
renderWidget(),
],
);
}
这样做的目的是,任何传入 bloc1 或 bloc2 的数据都将分别在 WidgetBlocBuilder1() 或 WidgetBlocBuilder2() 中进行本地化,更重要的是,传入的 bloc 数据不会导致另一个 bloc 的 BlocBuilder() 被重新调用-called() 就像我的嵌套 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(visibility:false) 包装器所示。这是因为小部件本身不应在屏幕上呈现任何内容;该小部件只是 BlocBuilder() 调用的包装器。如果传入的 bloc 数据应该更改父小部件的可见状态,则需要编写逻辑来实现它。
这个解决方法似乎可行,但我想知道是否有更好的解决方案。
如有任何建议,我们将不胜感激。
/小何塞
最佳答案
根据 pskink 的建议,另一种解决方案是使用一个 StreamBuilder() 来监听多个 bloc。为此,我使用了一个名为 multiple_streambuilder 的包。
这里是一个使用这个包的示例 build():
Widget build(BuildContext context) {
return StreamBuilder2<int, int>(
streams: Tuple2(bloc1!.stream, bloc2!.stream),
builder: (contex, snapshot) {
if (snapshot.item1.hasData) {
print(snapshot.item1.data);
}
if (snapshot.item2.hasData) {
print(snapshot.item2.data);
}
return Scaffold(
appBar: AppBar(title: Text("test title")),
body: WidgetTest(),
);
},
);
}
在上面的 build() 中,我正在监听 2 个 block ,它们都返回一个 int,因此调用了 StreamBuilder2
关于flutter - 嵌套的 BlocBuilder() 调用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68241884/