web-dev-qa-db-ja.com

Flutter:2つのStreamを1つの画面にストリーミングしますか?

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からウィジェットを作成したくないが、その中のデータを確認したい.

7

必要に応じて、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つのObservableStreamのサブクラス)の融合は次のようになります。

Observable<bool> stream1;
Observable<String> stream2;

final fusion = stream1.withLatestFrom(stream2, (foo, bar) {
  return MyClass(foo: foo, bar: bar);
});
19
Rémi Rousselet
Observable.combineLatest2(
        aStream,
        bStream,
        (a, b, c) =>
        a != '' && b != '');

composeLatestNは結合されたストリームを返します

0
Michel Tonon