Getx 2 - variables reactivas - Lista, Mapas, Objetos
Getx 2 - variables reactivas - Lista, Mapas, Objetos
En la entrega anterior hablaba de las variables primitivas reactivas obs, de los observadores y de cómo las variables obs envuelve el tipo especificado, estas son primitivas:
- final var = 0.obs; // Será un entero
- final var = ' '.obs; //String
- final var = 0.0.obs; //double
- final var = false.obs; //boolean
List y Map
Dart sí permite sobrecargar los métodos de List y Map, es por ello que no se utiliza value para acceder al valor contenido internamente en el observable.
Las List y Maps se definen:
- final lista = <String>[].obs;
- final mapa = <String, String>{}.obs;
- lista.add("cadena"); //añadimos una cadena
- lista[3]; //obtenemos el elemento 3 de la lista
- mapa["dato1"]="cadena"; // agregamos o modificamos el elemento "dato1"
- mapa["dato1"] ; //obtenemos el valor de "dato1"
A diferencia de las variables primitivas no necesitamos agregar value ni para cambiar ni para obtener el valor del observador.
Y sí, cada vez que modifiquemos la lista o el mapa nos comunicará el evento de cambio haciendo que nuestro Obx() que lo observa repinte el contenido.
Objetos
Esto es quizás la parte un poco más compleja en los observables de Getx.
Pongamos por ejemplo un objeto Persona:
class Persona {
class Persona {
String nombre = "";
String apellido = "";
}
String apellido = "";
}
Vamos a ver que pasa en cada uno de los casos.
Hacer observable el objeto en sí
Por ejemplo haciendo final persona = Persona().obs; lo que hace Getx, cómo ya vimos, es envolver al objeto persona en una variable observable:
Ahora bien, cómo un observable (obs) sólo reacciona cuando se modifica su valor, si cambiamos el nombre del objeto interno NO se disparará el evento de cambio. Si queremos que se notifique, en este caso, hay dos opciones:
- Crear un nuevo objeto,
persona.value = Persona(); ó persona(Persona()); - O indicar a GetX que queremos que notifique que hemos modificado el valor interno,
persona.update((p) {p.nombre = "pepe"});
La otra opción, que yo no uso prácticamente en los objetos propietarios, seria hacer observables los atributos, o todos o los que nos interesen.
Como vemos la diferencia es que el atributo nombre en la segunda es observable. Por supuesto no es necesario que todos los atributos sean observables.
Hacer observable los atributos del objeto
En este caso NO podremos observar los cambios de Persona, sino sólo del atributo nombre.
Para cambiarlo seria:
final persona = Persona();
final persona = Persona();
[...]
persona.nombre.value = "pepe";
Y con esto se notifica el cambio del atributo nombre al asignarle un valor.
persona.nombre.value = "pepe";
Y con esto se notifica el cambio del atributo nombre al asignarle un valor.
Estos atributos se comportan igual que las primitivas que vimos en la entrega anterior, simplemente que se encuentran dentro de un objeto.
Resumen
Ya casi es el final de la parte Getx reactiva. Getx define un tipo de objeto StateMixin que se usa sobre todo en Futures y es una mezcla entre reactivo y no, casi no sabría catalogarlo. Lo veremos cuando se vean los controladores.
Es muy importante no confundir la implementación reactiva de Getx con la que no lo es (cómo GetBuilder). Si hay interés puedo hablar de ella.
También puedes hacer update del objeto en lugar de tener observable los atributos
ResponderEliminarVar p = Persona ().obs
p.nombre = "asd"
p.update()
Sí cierto, se puede hacer.
Eliminar