BIN*_*GAR 8 stream dart flutter
我有两个流从两个不同的api获取。
Stream<Month> get monthOutStream => monthOutController.stream;
Stream<MySchedule> get resultOutStream => resultController.stream;
Run Code Online (Sandbox Code Playgroud)
我正在应用程序的两种不同状态下获取这些数据,这些结果是在用户发生一些事件之后的开始和几个月后得出的。
MyScheduleBloc(){
initialData();
}
Future initialData() async {
MySchedule mySchedule = await myScheduleViewModel.importMySchedule(now.id);
resultController.add(mySchedule);
}
Run Code Online (Sandbox Code Playgroud)
我的屏幕上有一个streambuilder作为
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);
},
);
}
Run Code Online (Sandbox Code Playgroud)
由于主要的窗口小部件构建方法将StreamBuilder窗口小部件与resultoutstream作为流。我在哪里获取另一个流monthoutStream。我可以在流中获取流吗?我在处理两个流时是否缺少任何东西。我不想从monthoutstream构建任何小部件,但想检查其中的数据。
Rém*_*let 20
StreamBuilder如果需要,可以嵌套。没有什么可以阻止您执行以下操作:
StreamBuilder(
stream: stream1,
builder: (context, snapshot1) {
return StreamBuilder(
stream: stream2,
builder: (context, snapshot2) {
// do some stuff with both streams here
},
);
},
)
Run Code Online (Sandbox Code Playgroud)
如果这对您有意义,则另一个解决方案是:流被设计为可合并/转换的。您可以制作第三个流,该流是后面两个流的合并。
对于复杂的流操作,理想情况下,您将需要使用rxdart,因为它提供了一些有用的转换器。
使用rxdart,两个Observable(属于的子类Stream)的融合如下:
Observable<bool> stream1;
Observable<String> stream2;
final fusion = stream1.withLatestFrom(stream2, (foo, bar) {
return MyClass(foo: foo, bar: bar);
});
Run Code Online (Sandbox Code Playgroud)
Observable.combineLatest2(
aStream,
bStream,
(a, b, c) =>
a != '' && b != '');
Run Code Online (Sandbox Code Playgroud)
mergeLatestN 返回组合流
就我而言,如果它们属于同一类型,我更喜欢将多个流合并为一个。所以你可以使用:
import 'package:async/async.dart' show StreamGroup;
...
StreamGroup.merge([stream1,stream2]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5269 次 |
| 最近记录: |