combine & CombineSpec

Un solo combinador para «quién dispara» y «quién debe haber hablado» — más zipAll y withLatestFromAll.

FxEvents<List<T>> combine<T>(Iterable<CombineSpec<T>> specs) class CombineSpec<T>(Stream<T> source, {bool causesEmit = true, bool requireFirst = true}) FxEvents<R> FxEvents<Stream<T>>.zipAll<R>([R Function(List<T> values)? project]) FxEvents<R> FxEvents<T>.withLatestFromAll<R>(Iterable<Stream<Object?>> others, R Function(T value, List<Object?> latest) combine)

Lección

combineLatest, withLatestFrom y zip difieren en quién puede disparar una emisión y en si todo lado debe haber hablado. combine es la forma unificada: una lista de CombineSpec, cada uno un source más dos flags. Es una función de nivel superior, no FxEvents.combine — Dart no puede añadir estáticos a FxEvents desde otro archivo.

causesEmit: true (el valor por defecto) significa que un evento de esta fuente puede producir una salida, una vez que todo spec requireFirst tiene un valor. Specs todos-true son FxEvents.combineLatestAll. causesEmit: false significa que esta fuente es solo contexto: actualiza el slot pero nunca dispara una emisión por sí sola — eso es withLatestFrom. requireFirst: true (el valor por defecto) retiene toda emisión hasta que esta fuente ha producido al menos un valor; false deja que el slot sea null hasta que hable. El resultado se cierra cuando todas las fuentes se han cerrado.

Junto a él viven dos combinadores más. zipAll sobre FxEvents<Stream<T>> recoge cada stream interior hasta que el exterior completa, y luego los empareja por índice — los interiores ni siquiera se suscriben hasta entonces. withLatestFromAll es el withLatestFrom N-ario: en cada evento de la fuente, lo combina con el más reciente de todos los demás, descartando los eventos de la fuente que llegan antes de que todos los demás hayan hablado. Capa de eventos de fxdart, según el combineLatest / withLatestFrom / zipAll de Rx.

Demo 1 · Ambos lados disparan

Demo 2 · Solo contexto — causesEmit: false

Pruébalo tú

Ejercicio: zipAll sobre un stream de streams, y withLatestFromAll sobre una fuente.

Relacionado: combineLatest — ambos lados disparan, el CombineSpec todos-true · withLatestFrom — unilateral, el spec causesEmit: false · waitAll — zip, combineLatestAll, concat