web-dev-qa-db-fra.com

La meilleure façon de transmettre des données entre widgets dans Flutter

Je développe mon propre widget personnalisé qui est utilisé dans une autre vue. Dans ce widget personnalisé, j'ai une propriété de classe qui stocke des informations, disons que c'est une liste qui gagne de nouveaux éléments à l'intérieur du widget. Maintenant, je veux obtenir des éléments de cette liste à partir du niveau de mon widget principal.

Comment faire ça? Je ne veux pas créer une variable comme celle-ci: var customWidget = MyCustomWidget() puis, obtenir la variable interne comme customWidget.createState().myList - Je pense que c'est une solution terrible (et je ne suis pas sûr si ça va marcher). Passer également une liste au constructeur de mon widget personnalisé semble très moche.

Existe-t-il un autre moyen d'obtenir l'état d'un autre widget?

16
mynameis

Tout d'abord, gardez à l'esprit que dans Flutter, les données ne peuvent être transmises que vers le bas. De par sa conception, il n'est pas possible d'accéder aux données des enfants, uniquement des parents (bien qu'il y ait des hacks autour).

À partir de là, il existe 2 solutions principales pour transmettre des données:

  1. Ajoutez les données souhaitées à vos constructeurs de widgets.

Je ne pense pas qu'il y ait beaucoup à dire ici. Facile à utiliser. Mais ennuyeux quand vous voulez passer un champ à toute votre arborescence de widgets. Utilisez cette méthode uniquement lorsque la portée d'une valeur est limitée. S'il s'agit de configurations ou de détails utilisateur, optez pour la deuxième solution.

class Bar extends StatelessWidget {
  final String data;

  Bar({this.data});

  @override
  Widget build(BuildContext context) {
    return Text(data);
  }
}
  1. Utilisation de BuildContext de Flutter

Chaque widget a accès à un BuildContext. Cette classe permet à un widget d'extraire des informations de n'importe lequel de leurs ancêtres en utilisant l'une des méthodes suivantes:

En fait, s'il y a des données auxquelles il faut accéder plusieurs fois, préférez inheritFromWidgetOfExactType.

Cela utilise InheritedWidget ; qui sont des types spécifiques de widgets extrêmement rapides d'accès.

Voir Flutter: Comment utiliser correctement un widget hérité? pour plus de détails sur leur utilisation


En remarque, il existe une troisième solution. Ce qui est GlobalKey

Je n'entrerai pas dans trop de détails, car il s'agit plus d'un hack que d'une solution appropriée. (voir Builder versus GlobalKey )

Mais en gros, cela permet d'obtenir l'état/le contexte des widgets any en dehors de l'appel build. Que ce soit les parents ou les enfants .

11
Rémi Rousselet