constructores

Constructores fríos para una cadena de eventos: un valor, un cierre vacío, un future, un generador, un callback create — sin un Stream que ya tuvieras que envolver.

FxEvents.value(T value) // of / just FxEvents.empty() // closes, no events FxEvents.fromFuture(Future<T> future) FxEvents.defer(Stream<T> Function() factory) // factory per listen FxEvents.generate(T initial, bool Function(T), T Function(T)) static FxEvents<int> FxEvents.timer(Duration delay, [Duration? every]) FxEvents.create(void Function(EventEmitter<T> emit) init) FxEvents.fromPattern(void Function(void Function(T)) add, void Function(void Function(T)) remove) static FxEvents<T> FxEvents.using<R, T>(R Function() acquire, Stream<T> Function(R) asStream, FutureOr<void> Function(R) release)

Lección

fxEvents(stream) envuelve un stream que ya tienes. Estos constructores son el stream. Se mantienen fríos: envolverlos o nombrarlos no escucha nada; un terminal (toList, head, listen) es lo que pone los eventos a fluir. Esa es la misma regla de honestidad que el resto de la cadena conserva.

Los simples primero. FxEvents.value(x) emite x y se cierra — el of/just de Rx. FxEvents.empty() se cierra sin nada. FxEvents.never() nunca emite y nunca se cierra; escuchar cuelga hasta que se cancela, así que es una mención, no una demo. fromFuture emite el valor del future (o su error) y se cierra; el future no se observa hasta que llega un listener. generate(initial, condition, iterate) recorre initial, iterate(initial), … mientras la condición se cumple — cada paso es un tick de temporizador, así que un generador infinito aún puede cancelarse.

Tiempo, después factorías. FxEvents.timer(delay) emite 0 tras el retardo y se cierra; con every continúa 1, 2, … en ese periodo. periodic es el reloj que nunca completa (conteo de ticks cuando se omite el computation) — cancélalo; no le hagas toList. defer(factory) construye un stream interior fresco en cada listen — la factoría, no el wrapper; la cadena se mantiene de suscripción única. using adquiere un recurso al escuchar, lo refleja y lo libera exactamente una vez — la contraparte push del using pull. fromPattern(add, remove) es el puente típico on/off. Y create(init) llama a init con un EventEmitter: add, addError, close, y onCancel para el teardown. Un throw desde init se reenvía y el stream se cierra.

Capa de eventos de fxdart, según el of/just, EMPTY, NEVER, from, interval, timer, defer, generate, fromEventPattern, using, y el constructor Observable / create de Rx.

Demo 1 · value, empty, generate

Demo 2 · defer, y fromFuture

Pruébalo tú

Ejercicio: un create que emite 1, 2, 3 y luego se cierra.

Relacionado: fxEvents — envolver un Stream que ya tienes · using — el original de la capa pull: adquirir en el primer pull, liberar una vez · share — cuando una ejecución de una cadena necesita muchos listeners