Manejador de eventos
En Reactter, el manejador de eventos juega un papel fundamental en facilitar la comunicación y coordinación sin problemas entre varios componentes dentro de la aplicación. Diseñado para garantizar una gestión de estados eficiente e inyección de dependencias, fomentando un ecosistema cohesivo donde diferentes partes de la aplicación pueden interactuar armoniosamente.
API
Reactter ofrece los siguientes mecanismos de manejador de eventos:
¿Cómo funciona?
El manejador de eventos en Reactter se basa en algunos conceptos fundamentales:
- Evento: Es un enumerador (
enum
) que representa una acción o suceso específico asociado a una instancia en particular. Define el tipo de interacción o cambio que puede ocurrir. - Instancia: Es un objeto (
Object
) utilizado para identificar la entidad que origina el evento y para emitir los eventos correspondientes. Actúa como el emisor que conecta el evento con la acción. - Acción: Es una función (
Function
) que se ejecuta en respuesta a un evento emitido. Contiene la lógica necesaria para gestionar el evento y definir el comportamiento deseado.
Entender estos conceptos es crucial para gestionar eficazmente las interacciones basadas en eventos en las aplicaciones de Reactter.
Ejemplo
Para ilustrar esto, tomemos un ejemplo de cuenta regresiva visto en la página de Gestión de estados:
1import 'dart:async';2import 'package:reactter/reactter.dart';3
4// Crea un estado reactivo llamado `count` utilizando la clase `Signal`5final count = Signal(10);6
7void main() async {8 // Escucha el evento `didUpdate` del estado `count`9 // e imprime `value` de `count` con cada actualización10 Rt.on(11 count,12 Lifecycle.didUpdate,13 (_, __) => print('Count: $count')14 );15
16 // Crea un temporizador que decrementa el `value` de `count`17 // en 1 cada segundo hasta que llegue a 018 await Timer.periodic(Duration(seconds: 1), countdown);19}20
21// Decrementa `value` de `count` en 1 cada ciclo del temporizador22// y cancela el `timer` cuando `value` de `count` llegue a 023void countdown(Timer timer) {24 count.value -= 1;25
26 if (count.value == 0) {27 timer.cancel();28 }29}
En este ejemplo, desde la línea 10 a la 14, vemos que el método Rt.on
se utiliza para suscribirse al evento Lifecycle.didUpdate
de la instancia count
.
Cada que cambie el estado de count
, se invoca la función (acción), que imprime el valor (value
) actual del estado de count
.
Aquí, no podemos ver la sentencia que emite ( emit
) porque se encuentra encapsulada dentro de la clase Signal
, y se llama cuando el value
del estado count
cambia.
Para ver cómo se emite un evento, hagamos un pequeño ajuste para agregar un emisor:
1import 'dart:async';2import 'package:reactter/reactter.dart';3
4enum CustomEvent { countdownFinished }5
6// Crea un estado reactivo llamado `count` utilizando la clase `Signal`7final count = Signal(10);8
9void main() async {10 // Escucha el evento `didUpdate` del estado `count`11 // e imprime `value` de `count` con cada actualización12 Rt.on(13 count,14 Lifecycle.didUpdate,15 (_, __) => print('Count: $count')16 );17
18 // Escucha el evento `countdownFinished` del estado `count`19 // e imprime un mensaje cuando la cuenta regresiva finaliza20 Rt.on(21 count,22 CustomEvent.countdownFinished,23 (_, __) => print('Countdown finished!')24 );25
26 // Crea un temporizador que decrementa el `value` de `count`27 // en 1 cada segundo hasta que llegue a 028 await Timer.periodic(Duration(seconds: 1), countdown);29}30
31
32// Decrementa `value` de `count` en 1 cada ciclo del temporizador33// y cancela el `timer` cuando `value` de `count` llegue a 034void countdown(Timer timer) {35 count.value -= 1;36
37 if (count.value == 0) {38 timer.cancel();39 // Emite el evento `countdownFinished` cuando la cuenta regresiva finaliza40 Rt.emit(count, CustomEvent.countdownFinished);41 }42}
Hemos añadido un nuevo evento llamado CustomEvent.countdownFinished
y una nueva function(accion) que imprime un mensaje cuando la cuenta regresiva finaliza.
Cuando la cuenta regresiva llega a 0
, la instancia count
emite el evento CustomEvent.countdownFinished
, y la función(accion) se invoca, imprimiendo el mensaje.
Este ejemplo demuestra cómo el sistema de manejador de eventos en Reactter facilita la comunicación sin problemas entre diferentes partes de la aplicación, facilitando una coordinación e interacción eficientes.