web-dev-qa-db-fra.com

Quelle est la différence entre initState et un constructeur de classe dans Flutter?

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.

16
Walter M

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 instance State

  • initState() est appelée après la création de l'objet et à ce stade, vous avez accès au BuildContext ou au StatefulWidget auquel le State est attaché, utilisant respectivement les propriétés context et widget. À ce stade, le State 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

17
MatPag

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?

6
diegoveloper

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.

0
Sanjay Singh