E non importa per mixin
s (e per questo per voi pure)
È un paradigma nel framework Flutter chiamare il metodo super quando si sovrascrivono i metodi del ciclo di vita in a State
. Questo è il motivo per cui deactivate
ha anche mustCallSuper
un'annotazione .
Inoltre , alcuni si mixin
aspettano che tu chiami i super metodi di quei metodi del ciclo di vita in un determinato punto della funzione.
Questo significa che si dovrebbe seguire la documentazione e la chiamata super.dispose
alla fine del dispose
metodo, perché mixin
s sul State
nell'ambito aspettano che questo è il caso.
Ad esempio: TickerProviderStateMixin
e affermare alla fine:SingleTickerProviderStateMixin
super.dispose
Tutti i ticker devono [..] essere eliminati prima di chiamare super.dispose ().
Un altro esempio: AutomaticKeepAliveMixin
esegue la logica in initState
e dispose
.
Conclusione
Inizia initState
consuper.initState
e termina dispose
consuper.dispose
se vuoi essere sul lato facile e sicuro aggiungendo mixin
s al tuo State
.
Inoltre, seguire la documentazione per altri metodi del ciclo di vita (qualsiasi metodo in cui si sovrascrive State
) perché il framework prevede che si chiamino i super metodi come descritto nella documentazione.
Quindi, ciò che dovresti fare è il seguente:
void initState() {
super.initState();
//DO OTHER STUFF
}
Tuttavia, non importa davveroState
, cosa che spiegherò nel seguito e anche per i mixin, importa solo per le affermazioni a giudicare da ciò che ho potuto trovare, quindi non influirebbe sulla tua app di produzione.
Non importa per State
Penso che le due precedenti risposte di Pablo Barrera e CopsOnRoad siano fuorvianti perché la verità è che non importa davvero e non è necessario guardare lontano.
Le uniche azioni che super.initState
e super.dispose
prendono nella State
classe stessa sono affermazioni e dal momento che assert
-statements vengono valutati solo in modalità debug , non importa a tutti una volta creare l'app, cioè in modalità di produzione.
Di seguito, ti guiderò attraverso cosa super.initState
e cosa super.dispose
fare State
, che è tutto il codice che verrà eseguito quando non hai altri mixin.
initState
Vediamo esattamente quale codice viene eseguito per super.initState
primo ( sorgente ):
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Come puoi vedere, esiste solo un'asserzione del ciclo di vita e lo scopo è garantire che il tuo widget funzioni correttamente. Quindi, finché chiami super.initState
da qualche parte nel tuo initState
, vedrai un AssertionError
se il tuo widget non funziona come previsto. Non importa se hai intrapreso qualche azione precedente perché assert
intende solo segnalare che qualcosa nel tuo codice è sbagliato comunque e lo vedrai anche se chiami super.initState
alla fine del tuo metodo.
dispose
Il dispose
metodo è analogo ( fonte ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Come puoi vedere, contiene anche solo asserzioni che gestiscono il controllo del ciclo di vita del debug . Il secondo assert
qui è un bel trucco perché assicura che _debugLifecycleState
sia cambiato solo in modalità debug (poiché gli assert
stati vengono eseguiti solo in modalità debug).
Ciò significa che finché chiami super.dispose
da qualche parte nel tuo metodo, non perderai alcun valore senza che i mixin aggiungano funzionalità aggiuntive.