groupsBy

Grupos en vivo a medida que se abren: una clave y un stream interno de cada valor posterior que la comparte.

class GroupedEvents<K, T> { final K key; final FxEvents<T> events; } FxEvents<GroupedEvents<K, T>> FxEvents<T>.groupsBy<K>(K Function(T value) keyOf, {Stream<void> Function(K key)? lastFor}) // chain (events)

Lección

El groupBy de la capa pull es un terminal: tira de todo y te entrega un Map. groupsBy es la versión en vivo. El primer valor de cada clave emite un GroupedEvents — un registro de esa key y un stream interno events — y cada valor posterior con la misma clave se reenvía a ese interno. Los grupos aparecen en el orden de primera aparición de la clave, a medida que se abren, no después de que la fuente se haya cerrado.

Es la misma idea de FxEvents anidados que window*, claveada por valor en vez de por tiempo. Un widget puede suscribirse al interno de un grupo en el momento en que aparece y ver los valores posteriores conforme llegan; no tiene que esperar a un lote.

Si se define lastFor, el primer evento (o la completación) de lastFor(key) completa ese grupo. Un valor posterior con la misma clave abre uno nuevo — un timeout de inactividad por usuario, una señal de «sesión terminada» por sala. Sin lastFor, los grupos se quedan abiertos hasta que la fuente completa (o falla, lo que hace fallar cada grupo en vivo y luego el exterior).

Cancelar el exterior completa los grupos en vivo en silencio, la misma regla de RxJS 9 que sigue la familia window. Capa de eventos de fxdart, según el groupBy de Rx.

Demo 1 · Grupos a medida que se abren

Demo 2 · lastFor cerrando un grupo

Pruébalo tú

Ejercicio: agrupa SKUs por el prefijo de departamento.

Relacionado: groupBy — el mismo agrupamiento como un Map con claves, en la capa pull · groupedBy — grupos de la capa pull como registros (key, items) encadenables · window* — internos en vivo rotados por conteo, disparador o reloj