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.

Secuencia de Lista con elementos de los valores actuales de otra secuencia.

Quiero crear un flujo de Lista basado en otro flujo de elementos. El flujo de Lista debe generar una nueva lista cada vez que un elemento de la lista emite un nuevo valor.

Algo así:

Stream<><modelo>> obtenerFlujoDeLista(List<int> ids) async* {
  final List<modelo> modelos = [];
  for (var id in ids) {
    obtenerFlujoDeModelo(id).listen((evento) {
      modelos.add(evento);
    });
  }
  yield modelos;
}

pero siempre genera un arreglo vacío.

Creo que el problema probablemente sea el hecho de que no reacciona al escucha de eventos.

¿Cómo se maneja este tipo de problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución podría ser utilizar el bucle await for en lugar del método listen(). El bucle await for nos permite escuchar un flujo completo y recopilar todos los valores emitidos en una lista. Aquí está una implementación actualizada:

    Stream<><model>> getListStream(List<int> ids) async* {
      final List<><model>> streams = ids.map(getModelStream).toList();
    
      final List<model> models = [];
      // esperar a que todos los flujos emitan un valor
      await for (final model in ZipStream.zip(streams)) {
        models.add(model.fold<><model>>((list, model) => list..add(model), []));
        yield models.toList();
      }
    }
    

    Aquí, primero recopilamos todos los flujos en una lista utilizando el método map(). Luego, utilizamos el método ZipStream.zip() para crear un nuevo flujo que combina los valores emitidos de todos los flujos en la lista.

    Luego utilizamos el bucle await for para escuchar cada evento emitido desde el nuevo flujo combinado. El método ZipStream.zip() asegura que obtengamos todos los valores emitidos de cada uno de los flujos originales. Luego agregamos cada modelo emitido a la lista models y devolvemos una nueva copia de la lista cada vez que se agrega un nuevo elemento. Esto debería solucionar el problema de la matriz vacía que se emite.

Comments are closed.