Es ist wichtig für mixin
s (und deswegen auch für Sie )
Es ist ein Paradigma im Flutter-Framework, die Supermethode aufzurufen, wenn Lebenszyklusmethoden in a überschrieben werden State
. Deshalb gibt es sogar deactivate
eine mustCallSuper
Anmerkung .
Darüber hinausmixin
erwarten einige, dass Sie die Supermethoden dieser Lebenszyklusmethoden an einem bestimmten Punkt in der Funktion aufrufen.
Dies bedeutet , dass Sie sollten die Dokumentation und Anruf folgen super.dispose
am Ende Ihrer dispose
Methode , da mixin
s auf State
im Rahmen erwarten , dass dies der Fall ist.
Zum Beispiel: TickerProviderStateMixin
und am Ende behaupten :SingleTickerProviderStateMixin
super.dispose
Alle Ticker müssen [..] entsorgt werden, bevor super.dispose () aufgerufen wird.
Ein weiteres Beispiel: AutomaticKeepAliveMixin
Führt Logik in initState
und aus dispose
.
Fazit
Beginnen Sie initState
mitsuper.initState
und beenden Sie dispose
mit,super.dispose
wenn Sie auf der einfachen und sicheren Seite sein möchten und mixin
s zu Ihrem hinzufügen möchten State
.
Befolgen Sie außerdem die Dokumentation für andere Lebenszyklusmethoden (jede Methode, die Sie überschreiben State
), da das Framework erwartet, dass Sie die in der Dokumentation beschriebenen Supermethoden aufrufen.
Daher sollten Sie Folgendes tun:
void initState() {
super.initState();
//DO OTHER STUFF
}
Es ist jedoch nicht wirklich wichtig State
, was ich im Folgenden erläutern werde, und selbst für Mixins, es ist nur wichtig für Aussagen, die nach dem urteilen, was ich finden konnte - es würde also Ihre Produktions-App nicht beeinträchtigen.
Es spielt keine Rolle für State
Ich denke , dass die letzten beiden Antworten von Pablo Barrera und CopsOnRoad sind irreführend , weil die Wahrheit der Sache ist , dass es wirklich keine Rolle und man nicht lange suchen müssen.
Die einzigen Aktionen , die super.initState
und super.dispose
in der nehmen State
Klasse selbst sind Behauptungen und da assert
-Aussagen nur in ausgewertet wird Debug - Modus , spielt es keine Rolle , auf alle einmal baut Ihre Anwendung, dh im Produktionsmodus.
Im Folgenden werde ich Sie durch das, was super.initState
und was Sie super.dispose
tun State
, führen. Dies ist der gesamte Code, der ausgeführt wird, wenn Sie keine zusätzlichen Mixins haben.
initState
Schauen wir uns genau an, in welchem Code zuerst ausgeführt wird super.initState
( Quelle ):
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Wie Sie sehen können, gibt es nur eine Bestätigung für den Lebenszyklus, mit der sichergestellt werden soll, dass Ihr Widget ordnungsgemäß funktioniert. Solange Sie super.initState
irgendwo in Ihrem eigenen anrufen initState
, sehen Sie, AssertionError
ob Ihr Widget nicht wie beabsichtigt funktioniert. Es spielt keine Rolle, ob Sie zuvor Maßnahmen ergriffen haben, da assert
nur gemeldet werden soll, dass etwas in Ihrem Code ohnehin nicht stimmt, und Sie werden dies auch dann sehen, wenn Sie super.initState
ganz am Ende Ihrer Methode aufrufen .
dispose
Die dispose
Methode ist analog ( Quelle ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Wie Sie sehen können, enthält es auch nur Zusicherungen, die die Überprüfung des Debug- Lebenszyklus behandeln. Der zweite assert
hier ist ein netter Trick, da er sicherstellt, dass der _debugLifecycleState
nur im Debug-Modus geändert wird (da assert
-Statements nur im Debug-Modus ausgeführt werden).
Dies bedeutet, dass Sie, solange Sie super.dispose
irgendwo in Ihrer eigenen Methode aufrufen , keinen Wert verlieren, ohne dass Mixins zusätzliche Funktionen hinzufügen.
initState()
Methode gibt ?assert(...)
Was ist also der Vorteil, wenn Sie diesuper.initState()
Produktions-App aufrufen ?mustCallSuper
diese Methode seit mehr als zwei Jahren anwendet, seit Flutter ins Leben gerufen wurde. Was ist der Vorteil, wenn Sie es dort platzieren, Sir?mixin
, wird es dennoch eine einzige Aussage geben,initState
die lautetassert(...)
: Welche Bedeutung hat es also, überhauptsuper.initState()
eine Produktions-App zu fordern ?super.initState()
sollte immer die erste Zeile in IhrerinitState
Methode sein.Aus Dokumenten:
quelle
Wie Sie in den Klassen des Frameworks sehen können, sollten Sie alles tun, nachdem das Widget initialisiert wurde, dh danach
super.initState()
.Ich würde logischerweise andersherum entsorgen, erst alles machen und dann anrufen
super.dispose()
.quelle
initState wird standardmäßig aufgerufen, wenn ein neues statusbehaftetes Widget zu einem Widget-Baum hinzugefügt wird. Jetzt führt der super.initState die Standardimplementierung der Basisklasse Ihres Widgets durch. Wenn Sie vor super.initState etwas aufrufen, das von der Basisklasse abhängt, kann dies zu Problemen führen. Aus diesem Grund wird empfohlen, initState folgendermaßen aufzurufen:
quelle
dispose
es das Gegenteil ist. Das Framework erwartet, dass Siesuper.dispose
am Ende anrufen , aber die Empfehlung ist korrekt.