es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una solución para este problema usando puro Dart. Puedes utilizar el método asyncExpand en stream1 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:

    Stream<data2?> getStream12() async* {
      final stream1 = getStream1();
      yield* stream1.asyncExpand((event) async* {
        if (event == null) {
          yield null;
        } else {
          yield* getStream2(event.var);
        }
      });
    }
    

    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 de getStream2(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 y getStream2 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?>

Comments are closed.