J'ai lu la documentation mais ce n'est pas clair.
Il indique "[initState est] appelé lorsque cet objet est inséré dans l'arborescence."
Lorsqu'un widget est inséré dans une arborescence, cela signifie qu'il a été créé, ce qui signifie que le constructeur de classe est appelé. Quel est le but de l'init? Le but du constructeur n'est-il pas d'initialiser l'instance de classe?
Merci les gars pour votre temps.
La différence est (dans le contexte de la création d'un objet State
) qui a la méthode initState()
:
constructor
créez simplement une nouvelle instanceState
initState()
est appelée après la création de l'objet et à ce stade, vous avez accès auBuildContext
ou auStatefulWidget
auquel leState
est attaché, utilisant respectivement les propriétéscontext
etwidget
. À ce stade, leState
est déjà monté.
Référence State
: https://docs.flutter.io/flutter/widgets/State-class.html
Référence mounted State
: https://docs.flutter.io/flutter/widgets/State/mounted.html
Dans certains cas, vous devrez démarrer une animation ou modifier l'état lorsque vous créez votre widget, il n'est alors pas possible de le faire dans votre constructeur car votre widget n'est pas encore inséré dans l'arborescence.
Exemple de contrôleur d'animation
AnimationController _animationController ;
...
@override
void initState() {
... instance the animationController
_animationController.forward();
super.initState();
}
Un autre exemple, lorsque vous recevez des paramètres d'un autre widget, disons que votre widget avec état a un paramètre nommé 'title' et que vous souhaitez créer une variable locale dans votre classe State pour gérer l'état, vous devrez faire quelque chose comme ceci:
class ExampleWidget extends StatefulWidget {
final String title;
ExampleWidget({this.title});
....
YourStateClass extends State<ExampleWidget> {
var localVariable;
@override
void initState() {
localVariable = widget.title;
super.initState();
}
et maintenant vous pouvez utiliser votre variable locale dans votre arborescence de widgets pour mettre à jour l'état.
Est-ce que ça fait du sens?
constructeur est utilisé pour créer une instance (objet).
initstate est utilisé pour initialiser le contenu d'un objet déjà existant.
Par exemple,
Supposons que vous ouvrez une application ayant plusieurs itinéraires/pages. Lorsque vous ouvrez une page particulière, un objet A de son contenu est créé (avec quelques données initiales) que vous voyez à l'écran.
Supposons maintenant que vous appuyez sur un bouton (qui effectue une tâche spécifique qui modifie les données) sur cette page particulière. Ensuite initstate sera appelé pour initialiser les données de l'objet A sans avoir à ouvrir à nouveau l'application depuis le début.
Aussi, il faut noter que initstate est appelé avant la construction et aucun contexte n'est disponible à ce moment.
C'est tout.