Cómo actualizar el árbol de widgets desde otra clase de widget – Flutter
Estoy enfrentando un problema para volver a renderizar la página cuando una variable cambia en una clase/widget (ambos widgets son clases stateful).
Aquí está cómo va:
Tengo tres botones en una clase que cambian el estado de una variable (foodCategory).
int foodCategory = 0;
// más abajo en el cuerpo del botón elevado - estoy actualizando la variable
setState(() {
foodCategory = 1;
});
Mientras tanto, en el otro widget, estoy usando esta variable para realizar ciertas acciones:
for (var item in foodItems.values.elementAt(foodCategory)) {
GestureDetector(........ y así sucesivamente...
}
Sin embargo, en el segundo fragmento, el widget no sabe si ha habido un cambio y no está llamando al context de construcción de nuevo…
No estoy seguro de cómo superar este problema. He intentado usar valuelistenablebuilder pero en vano. Tal vez no sé cómo usarlo en el bucle (estoy usando foodCategory como un int (iterador)).
davy.ai
Solución para volver a renderizar la página cuando una variable cambia en una clase/widget
Para superar el problema de volver a renderizar la página cuando una variable cambia en una clase/widget, puedes usar la función
setState()
para reconstruir el árbol de widgets con los valores actualizados. En tu caso, ya estás utilizandosetState()
para actualizar el valor defoodCategory
, pero el árbol de widgets no se reconstruye.Para hacer que el árbol de widgets se reconstruya, puedes mover la declaración de
foodCategory
a un widget padre y pasarlo al hijo como parámetro. Luego, puedes usar unValueNotifier
oChangeNotifier
para escuchar los cambios en el valor defoodCategory
y reconstruir el árbol de widgets cuando cambie.Aquí tienes un ejemplo de implementación:
Widget padre:
Widget hijo 1:
Widget hijo 2:
En el ejemplo anterior,
ParentWidget
mantiene el estado defoodCategory
y lo pasa a sus hijos como unValueNotifier
.ChildWidget1
escucha los cambios enfoodCategory
usandoValueListenableBuilder
, yChildWidget2
escucha los cambios usandoaddListener
yremoveListener
.Cada vez que
foodCategory
cambia, se llama a la funciónsetState()
para reconstruir el árbol de widgets con el valor actualizado, de modo que los cambios se reflejan en la interfaz de usuario.