Cómo devolver un flujo basado en el evento de otro flujo
Quiero devolver un flujo basado en el valor/evento de otro flujo.
Por ejemplo, si tengo 2 flujos, stream1 y stream2, quiero crear una función que devuelva como flujo stream2 o nulo, dependiendo del valor de stream1. ¿Cómo puedo hacerlo?
Intenté hacer un mapeo de stream1 y, basándome en el evento, devolver stream2, pero no funcionó. Tampoco puedo escuchar a stream1 y, basándome en el evento, devolver stream2.
Stream<data1?> getStream1() async* {
// yield stream1
}
Stream<data2?> getStream2(dynamic value) async* {
// yield stream2 basado en el value
}
Stream<data2?> getStream12() async* {
final stream1 = getStream1();
// no está funcionando
yield* stream1.map((event) => event == null ? null : getStream2(event.var));
// Intenté usar await for, pero tiene un comportamiento extraño
// si lo escucho después (es inconsistente)
await for (var event in stream1) {
if (event == null) {
yield null;
} else {
yield* getStream2(event.var);
}
}
}
¿Existe alguna solución para esto, de preferencia sin dependencias adicionales de paquetes como rxdart, solo dart puro?</data2?></data2?></data1?>
davy.ai
Sí, hay una solución para este problema usando puro Dart. Puedes utilizar el método
asyncExpand
enstream1
para mapear cada evento a un stream basado en su valor, y luego concatenar todos los streams resultantes en un solo stream de salida. Aquí hay un ejemplo de implementación:En esta implementación,
asyncExpand
toma una función que mapea cada evento a un stream, y luego aplana todos esos streams en un solo stream de salida. La función verifica si el evento es nulo, y si es así, emite nulo en el stream de salida. De lo contrario, emite el resultado degetStream2(event.var)
, que puede emitir uno o más eventos por sí mismo.Este enfoque debería funcionar como se espera, siempre y cuando
getStream1
ygetStream2
estén implementados correctamente. Como no depende de ningún paquete externo, es también una solución ligera que debería ser fácil de entender y mantener.</data2?>