web-dev-qa-db-fra.com

Pourquoi les widgets avec état sont-ils définis comme deux classes dans Flutter?

Je suis nouveau dans le flutter/Dart, donc pendant que j'essaye de faire une application, j'essaye aussi de comprendre pourquoi les choses sont d'une certaine manière. Dans les documents Flutter, il existe un exemple de code d'un widget avec état, comme indiqué:

class YellowBird extends StatefulWidget {
  const YellowBird({ Key key }) : super(key: key);

  @override
  _YellowBirdState createState() => new _YellowBirdState();
}

class _YellowBirdState extends State<YellowBird> {
  @override
  Widget build(BuildContext context) {
    return new Container(color: const Color(0xFFFFE306));
  }
}

Des questions:

  1. Pourquoi sont-ils définis avec deux classes au lieu d'une? Je suppose que la classe State peut être utilisée ailleurs, il valait donc mieux être divisé.

  2. D'après ce que je comprends, la fonction createState() renvoie un objet de type State, donc avoir _YellowBirdState extends State Est logique, mais pourquoi YellowBird est-il passé dans la classe générique de State? Je suppose que cela a quelque chose à voir avec Yellowbird étendre la classe StatefulWidget mais pas tout à fait sûr.

22
DanT29

Il y a plusieurs raisons:

  • Les widgets sont immuables. Puisque StatefulWidget étend Widget, il doit donc également être immuable. La division de la déclaration en deux classes permet à la fois à StatefulWidget d'être immuable et à State d'être mutable.

  • Les widgets sont instanciés à l'aide de la syntaxe new MyWidget(). Si nous fusionnions les deux classes en une seule, new MyWidget() réinitialiserait toutes les propriétés de l'état à chaque mise à jour parent.

Quant à l'explication de class _MyStatefulState extends State<MyStateful>

En effet, la classe State peut accéder à sa partie Stateful à l'aide de this.widget champ. Le générique est là pour rendre ce champ de type MyStateful au lieu de simplement StatefulWidget. Comme vous voudrez peut-être accéder aux propriétés MyStateful.

25
Rémi Rousselet
  1. L'une des principales décisions de conception de Flutter est qu'il est bon marché de recréer des widgets, donc build() peut être appelé pour reconstruire une branche de l'arborescence des widgets lorsque quelque chose change. Cela fonctionne bien pour les widgets sans état qui reçoivent leurs valeurs immuables via le constructeur. Mais les widgets avec état doivent conserver leur état dans les versions. Dans votre exemple, le framework peut créer plusieurs YellowBirds, mais il n'en crée jamais qu'un YellowBirdState. Chaque YellowBird nouvellement créé est connecté de manière transparente au YellowBirdState existant par le framework.

  2. Une sous-classe de State doit connaître son type de widget pour que le compilateur sache de quel type est la variable widget. Dans YellowBirdState, vous pouvez vous référer au Widget avec widget. Si YellowBird avait une variable membre final String foo, le compilateur sait que widget.foo est la chaîne appelée foo dans YellowBird.

15
Richard Heap