|
| 1 | +--- |
| 2 | +title: Vinculación del estado a la dependencia |
| 3 | +description: Aprende a vincular un estado a una dependencia en Reactter para una gestión de estado más eficiente y reactiva. |
| 4 | +--- |
| 5 | + |
| 6 | +import { Code } from "@astrojs/starlight/components"; |
| 7 | +import { HE, HK, HM, HN, HS, HT } from '@/components/Highlight'; |
| 8 | + |
| 9 | +:::tip |
| 10 | +Este guía asume que ya has leído sobre [Inyección de dependencias](/reactter/es/core_concepts/dependency_injection) y [Gestión del estado](/reactter/es/core_concepts/state_management). |
| 11 | +Se recomienda leer eso primero si eres nuevo en Reactter. |
| 12 | +::: |
| 13 | + |
| 14 | +Un estado de Reactter(<HT>[`RtState`](/reactter/es/core_concepts/state_management/#state)</HT>) como <HT>[`Signal`](/reactter/es/api/classes/signal)</HT> o cualquier <HT>[`Hooks`](/reactter/es/core_concepts/hooks)</HT> puede ser vinculado a la dependencia, permitiendo que el estado sea manipulado directamente desde la dependencia y notificar a sus oyentes sobre cualquier cambio. |
| 15 | +Además, asegura que el estado se elimine automáticamente cuando la dependencia ya no sea necesaria. |
| 16 | + |
| 17 | +Al integrar el estado directamente dentro de las dependencias, se beneficia de un **código más limpio** y **mantenible**. |
| 18 | +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. |
| 19 | +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. |
| 20 | + |
| 21 | +### Vinculación automática |
| 22 | + |
| 23 | +Para que esto suceda automáticamente, el estado debe declararse como propiedad o dentro del constructor de la dependencia. |
| 24 | +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: |
| 25 | + |
| 26 | +```dart title="count_controller.dart" "UseState" "UseEffect" |
| 27 | +import "package:reactter/reactter.dart"; |
| 28 | +
|
| 29 | +class CountController { |
| 30 | + // Estado declarado como propiedad |
| 31 | + final uCount = UseState(0); |
| 32 | +
|
| 33 | + CountController() { |
| 34 | + // Estado declarado dentro del constructor |
| 35 | + UseEffect(() { |
| 36 | + print("Count: ${uCount.value}"); |
| 37 | + }, [uCount]); |
| 38 | + } |
| 39 | +} |
| 40 | +``` |
| 41 | + |
| 42 | +En el ejemplo anterior, el estado `uCount` se declara como propiedad de la clase <HT>`CountController`</HT> y el hook <HT>`UseEffect`</HT> se utiliza dentro del constructor para reaccionar a los cambios en el estado `uCount`, imprimiendo su valor cada vez que cambia. |
| 43 | +Esto vincula automáticamente el estado `uCount` y el hook <HT>`UseEffect`</HT> a la instancia de <HT>`CountController`</HT>, demostrando cómo Reactter maneja la vinculación y reactividad de forma transparente. |
| 44 | + |
| 45 | +:::caution |
| 46 | +Si el estado se declara de forma perezosa (por ejemplo, utilizando la palabra clave <HK>`late`</HK>), no se vinculará automáticamente a la dependencia. |
| 47 | +En tales casos, debes usar el método <HT>`Rt.lazyState`</HT> para vincular el estado a la dependencia(Ver [vinculación perezoso](#vinculación-perezosa)). |
| 48 | +::: |
| 49 | + |
| 50 | +### Vinculación perezosa |
| 51 | + |
| 52 | +Cuando un estado se declara de forma perezosa, no se vincula automáticamente a la dependencia. |
| 53 | +En tales casos, puedes usar el método <HT>[`Rt.lazyState`](/reactter/es/api/methods/state_management_methods/#rtlazy_state)</HT> para vincular el estado a la dependencia, por ejemplo: |
| 54 | + |
| 55 | +```dart title="count_controller.dart" "UseState" "Rt.lazyState" |
| 56 | +import "package:reactter/reactter.dart"; |
| 57 | +
|
| 58 | +class CountController { |
| 59 | + final int initialCount; |
| 60 | +
|
| 61 | + late final uCount = Rt.lazyState( |
| 62 | + () => UseState(this.initialCount), |
| 63 | + this, |
| 64 | + ); |
| 65 | +
|
| 66 | + CountController([this.initialCount = 0]) { |
| 67 | + UseEffect(() { |
| 68 | + print("Count: ${uCount.value}"); |
| 69 | + }, [uCount]); |
| 70 | + } |
| 71 | +} |
| 72 | +``` |
| 73 | + |
| 74 | +En el ejemplo anterior, el estado `uCount` se declara de forma perezosa utilizando la palabra clave <HK>`late`</HK>. |
| 75 | +Para vincular el estado a la instancia de <HT>`CountController`</HT>, se utiliza el método <HT>[`Rt.lazyState`](/reactter/es/api/methods/state_management_methods/#rtlazy_state)</HT>, pasando la función de creación del estado y la instancia de la dependencia como argumentos. |
| 76 | +Esto asegura que cuando se accede a `uCount`, se vinculará automáticamente a la instancia de <HT>`CountController`</HT>. |
| 77 | + |
| 78 | +### Vinculación manual |
| 79 | + |
| 80 | +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. |
| 81 | +La vinculación manual proporciona un mayor control sobre cómo y cuándo se asocia el estado con la dependencia. |
| 82 | + |
| 83 | +Para vincular manualmente un estado a una dependencia, debes vincular explícitamente el estado dentro de la dependencia utilizando el método <HM>`bind`</HM> del estado, por ejemplo: |
| 84 | + |
| 85 | +```dart title="count_controller.dart" "UseState" "bind" |
| 86 | +class CountController { |
| 87 | + late final uCount = UseState(this.initialCount); |
| 88 | +
|
| 89 | + final int initialCount; |
| 90 | +
|
| 91 | + CountController([this.initialCount = 0]) { |
| 92 | + count.bind(this); |
| 93 | + } |
| 94 | +} |
| 95 | +``` |
| 96 | + |
| 97 | +En el ejemplo anterior, el estado `uCount` se declara de forma perezosa utilizando la palabra clave <HK>`late`</HK>. |
| 98 | +Para vincular el estado a la instancia de <HT>`CountController`</HT>, se utiliza el método <HM>`bind`</HM> del estado, pasando la instancia de la dependencia como argumento. |
| 99 | +Esto asegura que el estado `uCount` esté asociado a la instancia de <HT>`CountController`</HT>, lo que permite que la dependencia actualice reactivamente en función de los cambios en el estado. |
| 100 | + |
| 101 | +:::note |
| 102 | +La [vinculación manual](#vinculación-manual) y [vinculación perezosa](#vinculación-perezosa) tienen propositos diferentes. |
| 103 | +La vinculación manual es útil cuando se necesita un control preciso sobre el proceso de vinculación de estados, mientras que la **vinculación perezosa** es adecuada cuando se desea que el estado se inicialice sólo cuando se accede a él por primera vez. |
| 104 | +Elige el método adecuado en función de tus necesidades específicas. |
| 105 | +::: |
| 106 | + |
| 107 | +### Desvinculación automática |
| 108 | + |
| 109 | +Cuando se elimina una dependencia, el estado asociado se elimina automáticamente. |
| 110 | +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. |
| 111 | + |
| 112 | +En el ejemplo siguiente, el estado `uCount` se elimina automáticamente cuando se borra la instancia <HT>`CountController`</HT>, lo que garantiza que los recursos se liberan de forma eficiente: |
| 113 | + |
| 114 | +```dart title="main.dart" "Rt.create" "Rt.delete" |
| 115 | +import "./count_controller.dart"; |
| 116 | +
|
| 117 | +void main() { |
| 118 | + final controller = Rt.create(() => CountController(10)); |
| 119 | + controller.uCount.value += 2; // Count: 12 |
| 120 | + Rt.delete<CountController>(); |
| 121 | + controller.uCount.value += 3; // Error: "Can't update when it's been disposed" |
| 122 | +} |
| 123 | +``` |
| 124 | + |
| 125 | +### Desvinculación manual |
| 126 | + |
| 127 | +En algunos casos, puede que necesites desvincular manualmente un estado de una dependencia. |
| 128 | +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. |
| 129 | + |
| 130 | +Para desvincular manualmente un estado de una dependencia, puedes utilizar el método <HM>`unbind`</HM> del estado, por ejemplo: |
| 131 | + |
| 132 | +```dart title="count_controller.dart" "UseState" "unbind" |
| 133 | +class CountController { |
| 134 | + late final uCount = UseState(this.initialCount); |
| 135 | +
|
| 136 | + final int initialCount; |
| 137 | +
|
| 138 | + CountController([this.initialCount = 0]) { |
| 139 | + count.bind(this); |
| 140 | + } |
| 141 | +
|
| 142 | + void dispose() { |
| 143 | + count.unbind(this); |
| 144 | + } |
| 145 | +} |
| 146 | +``` |
| 147 | + |
| 148 | +:::caution |
| 149 | +Aunque la desvinculación manual proporciona un mayor control, un uso inadecuado puede provocar problemas de gestión de memoria y aumentar el riesgo de errores. |
| 150 | +Se recomienda utilizar la [desvinculación automática](#desvinculación-automática) siempre que sea posible, ya que simplifica el proceso y reduce la probabilidad de introducir fugas de memoria o de no liberar los recursos correctamente. |
| 151 | + |
| 152 | +La desvinculación manual debe utilizarse con precaución y sólo cuando sea absolutamente necesario. |
| 153 | +Además, los desarrolladores deben asegurarse de realizar un seguimiento del proceso de desvinculación para evitar dejar estados no utilizados en memoria, lo que podría afectar negativamente al rendimiento y la utilización de recursos. |
| 154 | +::: |
| 155 | + |
| 156 | + |
0 commit comments