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:
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é.
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.
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
.
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 YellowBird
s, 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.
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
.