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.
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);
});
Observable.combineLatest2(
aStream,
bStream,
(a, b, c) =>
a != '' && b != '');
combineLatestN renvoie un flux combiné