Flutter : comment changer l'état d'un StatefulWidget à partir d'un autre StatefulWidget ?

Dans le framework Flutter, il est possible, comme dans d'autres frameworks, d'utiliser la notion d'état. Avoir un état permet à un widget de changer au cours de sa vie. En utilisant le type "StatefulWidget", on ajoute cette notion d'état, ce qui permet une plus grande interactivité entre les widgets de votre application. Il est possible de changer l'état d'un autre widget de ce type depuis votre widget, et il existe plusieurs méthodes.

Pour lier deux widgets de la classe "StatefulWidget", il faut que l'un soit le parent de l'autre. Dans le widget enfant, vous devez ajouter une fonction en paramètre de la création de ce widget. Cette fonction devra être implémentée dans le widget parent et transmise au widget enfant lors de sa création. Elle devra utiliser la méthode "setState" pour modifier l'état du parent. Le widget enfant n'a plus qu'à appeler la fonction du parent lorsqu'il a besoin de notifier une modification.

//Le widget enfant accepte une fonction en paramètre à la création
class WidgetEnfant extends StatefulWidget {
  final Function notifierParent;
  WidgetEnfant({Key key, @required this.notifierParent}) : super(key: key);
}
//Dans le parent : déclaration et passage de la fonction à l'enfant
fonctionDuParent() {
  setState(() {});
}
…
new ChildWidget( notifierParent: fonctionDuParent );
//L'enfant peut appeler la fonction du parent quand il veut
widget.notifierParent();

Si vous avez besoin d'utiliser plusieurs éléments du widget parent, vous pouvez également le transmettre en totalité au widget enfant. Dans le widget parent, passer "this" en paramètre de l'enfant lors de sa création.

class WidgetParent extends StatefullWidget {
int compteur = 0;

//Widget parent (création de l'enfant)
new Enfant(this);

//Widget enfant
class WidgetEnfant {

WidgetParent parent;

WidgetEnfant(this.parent);

//Appel
this.parent.compteur++;

Android