web-dev-qa-db-fra.com

Flutter: diffuser deux flux sur un seul écran?

J'ai deux flux récupérant à partir de deux API différentes.

Stream<Month> get monthOutStream => monthOutController.stream;
Stream<MySchedule> get resultOutStream => resultController.stream;

Je récupère ces données à deux états différents de l'application, résultat au début et mois après certains événements de l'utilisateur.

MyScheduleBloc(){
  initialData();
}

Future initialData() async {
  MySchedule mySchedule = await myScheduleViewModel.importMySchedule(now.id);
  resultController.add(mySchedule);
}

Mon écran a un streambuilder comme

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);
   },
 );
}

Étant donné que la méthode de construction du widget principal a pris le widget StreamBuilder avec resultoutstream en tant que flux, où puis-je récupérer l'autre stream monthoutStream? Puis-je récupérer un flux dans un flux? Dois-je manquer quelque chose lors de la gestion de deux flux.Je ne veux pas construire de widget à partir de monthoutstream, mais je veux vérifier les données qu'il contient.

7
BINAY THAPA MAGAR

Vous pouvez imbriquer StreamBuilder si nécessaire. Rien ne vous empêche de faire ce qui suit:

StreamBuilder(
  stream: stream1,
  builder: (context, snapshot1) {
    return StreamBuilder(
      stream: stream2,
      builder: (context, snapshot2) {
        // do some stuff with both streams here
      },
    );
  },
)

Une autre solution si cela vous convient est: les flux sont conçus pour être fusionnables/transformés. Vous pouvez créer un troisième flux qui est une fusion des deux flux ultérieurs.

Idéalement pour les opérations de flux complexes, vous voudrez utiliser rxdart car il fournit quelques transformateurs utiles.

En utilisant rxdart, la fusion de deux Observable (qui sont des sous-classes de Stream) serait la suivante:

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 != '');

combineLatestN renvoie un flux combiné

0
Michel Tonon