stopOn & startOn

Dos compuertas gobernadas por un segundo stream: stopOn cierra la cadena cuando el disparador salta, startOn la abre.

FxEvents<T> FxEvents<T>.stopOn(Stream<void> trigger) // chain (events) FxEvents<T> FxEvents<T>.startOn(Stream<void> trigger) // chain (events)

Lección

Una cadena push no tiene un final natural. Un pipeline pull para cuando el consumidor deja de pedir, pero un feed en vivo — un socket, un sensor, un Stream.periodic — sigue produciendo hasta que algo lo cancela. Olvidarse de hacerlo es la fuga clásica: se destruye una pantalla, el widget ya no está, y su suscripción sigue despierta, sigue reservando memoria, sigue llamando a setState sobre un cadáver.

stopOn(trigger) convierte el apagado en parte de la cadena en vez de en una variable que tienes que acordarte de cancelar. El primer evento de trigger cierra la salida y cancela las dos suscripciones: la de la fuente y la del disparador. No se lee nada de lo que lleve el disparador, solo que disparó, así que su tipo es Stream<void> y sirve cualquier stream.

startOn(trigger) es el espejo: los eventos de la fuente se descartan hasta que el disparador salta una vez, y a partir de ahí pasan para siempre. Es la compuerta de «espera a estar listo»: no actúes sobre los toques hasta que la sesión haya cargado. Ojo, no tiene relación con startWith, que antepone un valor en lugar de controlar el arranque; los dos nombres quedan cerca y significan cosas bastante distintas.

El sufijo …On es el convenio de la capa de eventos para «gobernado por un stream disparador», compartido con sampleOn y chunkOn. Capa de eventos de fxdart, siguiendo a takeUntil y skipUntil de Rx: los nombres difieren porque Fx.takeUntil ya significa el takeUntilInclusive gobernado por predicado del lado pull, y un nombre no puede significar dos cosas en una misma biblioteca.

Demo 1 · El interruptor de apagado

Demo 2 · El interruptor de encendido

Pruébalo tú

Ejercicio: una ventana de sesión, construida con las dos compuertas.

Relacionado: FxSubscriptions — la otra mitad del desmontaje: cancelar muchas suscripciones a la vez · sampleOn — el mismo convenio de disparador, para leer en vez de parar · race — cancelación decidida por quien hable primero