2つの異なるAPIからフェッチする2つのストリームがあります。
Stream<Month> get monthOutStream => monthOutController.stream;
Stream<MySchedule> get resultOutStream => resultController.stream;
これらのデータは、アプリケーションの2つの異なる状態で取得しています。結果は、ユーザーからのイベントの開始時と数か月後の結果です。
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ウィジェットを取得したため、他のストリームmonthoutStreamをどこで取得しますか。ストリーム内のストリームをフェッチできますか? 2つのストリームの処理中に何かが足りない場合、monthoutstreamからウィジェットを作成したくないが、その中のデータを確認したい.
必要に応じて、StreamBuilder
をネストできます。次のことを妨げるものは何もありません。
StreamBuilder(
stream: stream1,
builder: (context, snapshot1) {
return StreamBuilder(
stream: stream2,
builder: (context, snapshot2) {
// do some stuff with both streams here
},
);
},
)
これが理にかなっている場合の別の解決策は次のとおりです。ストリームはマージ可能/変換されるように設計されています。後の2つのストリームのマージである3番目のストリームを作成できます。
複雑なストリーム操作には、いくつかの便利なトランスフォーマーが提供されるため、 rxdart を使用するのが理想的です。
Rxdartを使用すると、2つのObservable
(Stream
のサブクラス)の融合は次のようになります。
Observable<bool> stream1;
Observable<String> stream2;
final fusion = stream1.withLatestFrom(stream2, (foo, bar) {
return MyClass(foo: foo, bar: bar);
});
Observable.combineLatest2(
aStream,
bStream,
(a, b, c) =>
a != '' && b != '');
composeLatestNは結合されたストリームを返します