Saltearse al contenido

Vinculación del estado a la dependencia

Un estado de Reactter( RtState ) como Signal o cualquier Hooks puede ser vinculado a la dependencia, permitiendo que el estado sea manipulado directamente desde la dependencia y notificar a sus oyentes sobre cualquier cambio. Además, asegura que el estado se elimine automáticamente cuando la dependencia ya no sea necesaria.

Al integrar el estado directamente dentro de las dependencias, se beneficia de un código más limpio y mantenible. El manejo automático por parte de Reactter significa menos código repetitivo y *menos errores relacionados con la gestión manual del estado, lo que conduce a un proceso de desarrollo más eficiente. Este enfoque simplifica la sincronización entre el estado y su dependencia asociada, mejorando la capacidad de respuesta y la fiabilidad general de su aplicación.

Vinculación automática

Para que esto suceda automáticamente, el estado debe declararse como propiedad o dentro del constructor de la dependencia. Cuando se hace esto, Reactter se encarga automáticamente de vincular el estado a la dependencia, asegurando una gestión y reactividad del estado sin problemas, por ejemplo:

count_controller.dart
1
import "package:reactter/reactter.dart";
2
3
class CountController {
4
// Estado declarado como propiedad
5
final uCount = UseState(0);
6
7
CountController() {
8
// Estado declarado dentro del constructor
9
UseEffect(() {
10
print("Count: ${uCount.value}");
11
}, [uCount]);
12
}
13
}

En el ejemplo anterior, el estado uCount se declara como propiedad de la clase CountController y el hook UseEffect se utiliza dentro del constructor para reaccionar a los cambios en el estado uCount, imprimiendo su valor cada vez que cambia. Esto vincula automáticamente el estado uCount y el hook UseEffect a la instancia de CountController , demostrando cómo Reactter maneja la vinculación y reactividad de forma transparente.

Vinculación perezosa

Cuando un estado se declara de forma perezosa, no se vincula automáticamente a la dependencia. En tales casos, puedes usar el método Rt.lazyState para vincular el estado a la dependencia, por ejemplo:

count_controller.dart
1
import "package:reactter/reactter.dart";
2
3
class CountController {
4
final int initialCount;
5
6
late final uCount = Rt.lazyState(
7
() => UseState(this.initialCount),
8
this,
9
);
10
11
CountController([this.initialCount = 0]) {
12
UseEffect(() {
13
print("Count: ${uCount.value}");
14
}, [uCount]);
15
}
16
}

En el ejemplo anterior, el estado uCount se declara de forma perezosa utilizando la palabra clave late . Para vincular el estado a la instancia de CountController , se utiliza el método Rt.lazyState , pasando la función de creación del estado y la instancia de la dependencia como argumentos. Esto asegura que cuando se accede a uCount, se vinculará automáticamente a la instancia de CountController .

Vinculación manual

Si bien la vinculación automática simplifica la gestión del estado, puede haber escenarios en los que necesites vincular manualmente el estado a una dependencia. La vinculación manual proporciona un mayor control sobre cómo y cuándo se asocia el estado con la dependencia.

Para vincular manualmente un estado a una dependencia, debes vincular explícitamente el estado dentro de la dependencia utilizando el método bind del estado, por ejemplo:

count_controller.dart
1
class CountController {
2
late final uCount = UseState(this.initialCount);
3
4
final int initialCount;
5
6
CountController([this.initialCount = 0]) {
7
count.bind(this);
8
}
9
}

En el ejemplo anterior, el estado uCount se declara de forma perezosa utilizando la palabra clave late . Para vincular el estado a la instancia de CountController , se utiliza el método bind del estado, pasando la instancia de la dependencia como argumento. Esto asegura que el estado uCount esté asociado a la instancia de CountController , lo que permite que la dependencia actualice reactivamente en función de los cambios en el estado.

Desvinculación automática

Cuando se elimina una dependencia, el estado asociado se elimina automáticamente. Este mecanismo de desvinculación automática simplifica la gestión de estados y reduce el riesgo de fugas de memoria o desperdicio de recursos.

En el ejemplo siguiente, el estado uCount se elimina automáticamente cuando se borra la instancia CountController , lo que garantiza que los recursos se liberan de forma eficiente:

main.dart
1
import "./count_controller.dart";
2
3
void main() {
4
final controller = Rt.create(() => CountController(10));
5
controller.uCount.value += 2; // Count: 12
6
Rt.delete<CountController>();
7
controller.uCount.value += 3; // Error: "Can't update when it's been disposed"
8
}

Desvinculación manual

En algunos casos, puede que necesites desvincular manualmente un estado de una dependencia. La desvinculación manual proporciona un mayor control sobre cuándo se libera el estado y puede ser útil en escenarios en los que se desea desvincular el estado de forma temporal o permanente.

Para desvincular manualmente un estado de una dependencia, puedes utilizar el método unbind del estado, por ejemplo:

count_controller.dart
1
class CountController {
2
late final uCount = UseState(this.initialCount);
3
4
final int initialCount;
5
6
CountController([this.initialCount = 0]) {
7
count.bind(this);
8
}
9
10
void dispose() {
11
count.unbind(this);
12
}
13
}