stopOn & startOn
Dos compuertas gobernadas por un segundo stream: stopOn cierra la cadena cuando el disparador salta, startOn la abre.
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.
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