Saltearse al contenido

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:

main.dart
1
import 'dart:async';
2
import 'package:reactter/reactter.dart';
3
4
// Crea un estado reactivo llamado `count` utilizando la clase `Signal`
5
final count = Signal(10);
6
7
void main() async {
8
// Escucha el evento `didUpdate` del estado `count`
9
// e imprime `value` de `count` con cada actualización
10
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 0
18
await Timer.periodic(Duration(seconds: 1), countdown);
19
}
20
21
// Decrementa `value` de `count` en 1 cada ciclo del temporizador
22
// y cancela el `timer` cuando `value` de `count` llegue a 0
23
void 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:

main.dart
1
import 'dart:async';
2
import 'package:reactter/reactter.dart';
3
4
enum CustomEvent { countdownFinished }
5
6
// Crea un estado reactivo llamado `count` utilizando la clase `Signal`
7
final count = Signal(10);
8
9
void main() async {
10
// Escucha el evento `didUpdate` del estado `count`
11
// e imprime `value` de `count` con cada actualización
12
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 finaliza
20
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 0
28
await Timer.periodic(Duration(seconds: 1), countdown);
29
}
30
31
32
// Decrementa `value` de `count` en 1 cada ciclo del temporizador
33
// y cancela el `timer` cuando `value` de `count` llegue a 0
34
void 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 finaliza
40
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.