stream - Flutter:将两个 Stream 流式传输到一个屏幕中?
问题描述
我有两个流从两个不同的 api 中获取。
Stream<Month> get monthOutStream => monthOutController.stream;
Stream<MySchedule> get resultOutStream => resultController.stream;
我在应用程序的两种不同状态下获取这些数据,即开始时的结果和来自用户的某些事件后的几个月。
MyScheduleBloc(){
initialData();
}
Future initialData() async {
MySchedule mySchedule = await myScheduleViewModel.importMySchedule(now.id);
resultController.add(mySchedule);
}
我的屏幕有一个流构建器
Widget build(BuildContext context) {
final webCalenderBloc = WebCalenderBloc();
return StreamBuilder(
stream: webCalenderBloc.resultOutStream,
builder: (BuildContext context , snapdata){
if(!snapdata.hasData){
return Center(
child: CircularProgressIndicator(),
);
}
return body(snapdata.data);
},
);
}
由于主要的小部件构建方法将带有 resultoutstream 的 StreamBuilder 小部件作为流。我在哪里获取另一个流月outStream。我可以在流中获取流吗?在处理两个流时我是否遗漏了任何东西。我不想从monthoutstream 构建任何小部件,但想检查其中的数据。
解决方案
StreamBuilder
如果需要,您可以嵌套。没有什么可以阻止您执行以下操作:
StreamBuilder(
stream: stream1,
builder: (context, snapshot1) {
return StreamBuilder(
stream: stream2,
builder: (context, snapshot2) {
// do some stuff with both streams here
},
);
},
)
如果这对您有意义,另一种解决方案是:流被设计为可合并/转换。您可以制作第三个流,它是后面两个流的合并。
理想情况下,对于复杂的流操作,您需要使用rxdart,因为它提供了一些有用的转换器。
使用 rxdart,两个Observable
(它们是 的子类Stream
)的融合如下:
Observable<bool> stream1;
Observable<String> stream2;
final fusion = stream1.withLatestFrom(stream2, (foo, bar) {
return MyClass(foo: foo, bar: bar);
});
推荐阅读
- mysql - SQL 在哪里存在内部 where 条件?
- python - 太多值无法解包(预期为 2) - 字典到 JSON
- r - 如何延长刻面网格ggplot中的特定刻度线?
- php - 从我的 public_html 文件夹中可用的所有文件夹中删除具有特定名称的文件
- git - 编辑 git 历史的影响
- vb.net - 使用校验位算法来判断输入的值是否有效?
- ruby-on-rails - haml 中的 form_tag 创建没有输入的表单
- reactjs - fetch后在react组件中获取重复元素更多
- r - 在 Shiny 中创建多个内联输入组
- php - PHP 警告:mysqli::__construct(): (HY000/2002): 没有这样的文件或目录 (Debian GNU/Linux 9)