FxSubscriptions

Una bolsa de suscripciones, canceladas a la vez — para que el desmontaje sea una llamada en vez de un campo por stream.

class FxSubscriptions { int get length; bool get isEmpty; bool get isNotEmpty; StreamSubscription<T> add<T>(StreamSubscription<T> subscription); void addAll(Iterable<StreamSubscription<void>> subscriptions); Future<void> cancelAll(); // cancel every one, and empty the bag void pauseAll(); void resumeAll(); }

Lección

Un objeto que escucha varios streams tiene que mantener viva cada suscripción por un único motivo: volver a cancelarla más tarde. El resultado es el montón conocido de campos nullables, cada uno declarado arriba, cada uno asignado en initState, cada uno cancelado en dispose; y la fuga siempre es la que alguien se olvidó de añadir a la tercera lista.

FxSubscriptions reduce eso a un solo objeto. add mete una suscripción en la bolsa y la devuelve, así que se lee como una expresión y no como una sentencia, y cancelAll() las termina todas. El desmontaje se convierte en una sola línea: Future<void> dispose() => subs.cancelAll();

pauseAll() y resumeAll() son la versión suave, para cuando el trabajo debe pararse sin que se deshaga el cableado: una pantalla que pasa a segundo plano, una pestaña que pierde el foco. Las suscripciones en pausa almacenan en vez de descartar, así que no se pierde nada durante el hueco.

La bolsa se vacía antes de esperar sus cancelaciones, así que un segundo cancelAll() durante la espera no puede cancelar nada dos veces, y el mismo objeto puede albergar después una generación nueva de suscripciones. Capa de eventos de fxdart, siguiendo a CompositeSubscription de Rx.

Se lleva de forma natural con stopOn: usa stopOn cuando una cadena debe terminar porque algo ha pasado, y FxSubscriptions cuando un conjunto de cadenas debe terminar porque lo que las poseía se va.

Demo 1 · El dispose de una línea

Demo 2 · Pausar sin desmontar

Pruébalo tú

Ejercicio: addAll, y reutilizar la bolsa después de un cancel.

Relacionado: stopOn — desmontaje gobernado por un evento en vez de por el ciclo de vida de un propietario · fxEvents — la cadena cuyo listen te entrega las suscripciones que esto guarda · LiveValue — tiene su propio close(), y esta bolsa no lo guarda