Cela compte pour mixin
s (et à cause de cela pour vous aussi)
C'est un paradigme dans le cadre Flutter d'appeler la super méthode lors de la substitution des méthodes de cycle de vie dans a State
. C'est pourquoi a même deactivate
une mustCallSuper
annotation .
De plus , certains mixin
s'attendent à ce que vous appeliez les super méthodes de ces méthodes de cycle de vie à un point particulier de la fonction.
Cela signifie que vous devez suivre la documentation et l' appel super.dispose
à la fin de votre dispose
méthode , car mixin
s sur State
dans le cadre attendent à ce que ce soit le cas.
Par exemple: TickerProviderStateMixin
et affirmez à la fin:SingleTickerProviderStateMixin
super.dispose
Tous les tickers doivent [..] être supprimés avant d'appeler super.dispose ().
Autre exemple: AutomaticKeepAliveMixin
exécute la logique dans initState
et dispose
.
Conclusion
Commencez votre initState
avecsuper.initState
et terminez votre dispose
avecsuper.dispose
si vous voulez être sur le côté facile et sûr ajouter mixin
s à votre State
.
De plus, suivez la documentation des autres méthodes de cycle de vie (toute méthode dans laquelle vous écrasez State
) car le framework attendra que vous appeliez les super méthodes comme décrit dans la documentation.
Ainsi, voici ce que vous devez faire:
void initState() {
super.initState();
//DO OTHER STUFF
}
Cependant, cela n'a pas vraiment d' importance pour State
, ce que je vais expliquer dans la suite et même pour les mixins, cela n'a d'importance que pour les affirmations à en juger par ce que j'ai pu trouver - donc cela n'affecterait pas votre application de production.
Peu importe pour State
Je pense que les deux réponses précédentes de Pablo Barrera et CopsOnRoad sont trompeuses parce que la vérité est que cela n'a pas vraiment d'importance et que vous n'avez pas besoin de chercher loin.
Les seules actions super.initState
et super.dispose
prennent dans la State
classe elle - même sont des affirmations et puisque assert
-statements ne sont évaluées en mode débogage , il n'a pas d' importance du tout une fois construire votre application, soit en mode de production.
Dans ce qui suit, je vais vous guider à travers quoi super.initState
et super.dispose
faire State
, qui est tout le code qui sera exécuté lorsque vous n'aurez pas de mixins supplémentaires.
initState
Voyons exactement quel code est exécuté en super.initState
premier ( source ):
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Comme vous pouvez le voir, il n'y a qu'une assertion de cycle de vie et le but est de s'assurer que votre widget fonctionne correctement. Donc, tant que vous appelez super.initState
quelque part dans votre propre initState
, vous verrez un AssertionError
si votre widget ne fonctionne pas comme prévu. Peu importe que vous ayez pris une mesure préalable, car le assert
est uniquement destiné à signaler que quelque chose dans votre code est de toute façon incorrect et vous le verrez même si vous appelez super.initState
à la toute fin de votre méthode.
dispose
La dispose
méthode est analogue ( source ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Comme vous pouvez le voir, il ne contient également que des assertions qui gèrent la vérification du cycle de vie de débogage . La seconde assert
est une bonne astuce car elle garantit que le _debugLifecycleState
n'est modifié qu'en mode débogage (car les assert
instructions ne sont exécutées qu'en mode débogage).
Cela signifie que tant que vous appelez super.dispose
quelque part dans votre propre méthode, vous ne perdrez aucune valeur sans que les mixins ajoutent des fonctionnalités supplémentaires.
initState()
méthodeassert(...)
, alors quel est l'avantage même d'appelersuper.initState()
dans l'application de production?mustCallSuper
en place cette méthode depuis plus de 2 ans maintenant depuis la naissance de Flutter. Quel est l'avantage de le mettre là, monsieur?mixin
, il y aura toujours une seule déclaration dans ceinitState
qui estassert(...)
, alors quelle est la signification même d'appelersuper.initState()
une application de production?super.initState()
devrait toujours être la première ligne de votreinitState
méthode.Depuis les documents:
la source
Comme vous pouvez le voir dans les classes du framework, vous devez tout faire après l'initialisation du widget, c'est-à-dire après
super.initState()
.Je cas de disposer serait logiquement dans l'autre sens, tout d'abord faire puis appeler
super.dispose()
.la source
initState est appelé par défaut chaque fois qu'un nouveau widget avec état est ajouté dans une arborescence de widgets. Maintenant, le super.initState effectue l'implémentation par défaut de la classe de base de votre widget.Si vous appelez quelque chose avant super.initState qui dépend de la classe de base, cela pourrait poser problème. C'est pourquoi il est recommandé d'appeler initState de cette façon:
la source
dispose
c'est le contraire. Le cadre s'attend à ce que vous appeliezsuper.dispose
à la fin , mais la recommandation est correcte.