Importa para mixin
s (e por isso também para você )
É um paradigma na estrutura do Flutter chamar o super método ao substituir os métodos do ciclo de vida em a State
. É por isso que ainda deactivate
tem uma mustCallSuper
anotação .
Além disso , alguns mixin
esperam que você chame os super métodos desses métodos de ciclo de vida em um ponto específico da função.
Isso significa que você deve seguir a documentação e chamada super.dispose
no final do seu dispose
método porque mixin
s sobre State
no quadro esperar que este é o caso.
Por exemplo: TickerProviderStateMixin
e afirme no final:SingleTickerProviderStateMixin
super.dispose
Todos os Tickers devem [...] ser descartados antes de chamar super.dispose ().
Outro exemplo: AutomaticKeepAliveMixin
executa a lógica em initState
e dispose
.
Conclusão
Comece initState
comsuper.initState
e termine dispose
comsuper.dispose
se quiser estar do lado fácil e seguro, adicionando mixin
s ao seu State
.
Além disso, siga a documentação para outros métodos de ciclo de vida (qualquer método em que você substitua State
) porque a estrutura espera que você chame os super métodos, conforme descrito na documentação.
Assim, o seguinte é o que você deve fazer:
void initState() {
super.initState();
//DO OTHER STUFF
}
No entanto, isso realmente não importa State
, o que explicarei a seguir e mesmo para mixins, importa apenas para afirmações que julgam o que eu poderia encontrar - para que não afetasse seu aplicativo de produção.
Não importa para State
Penso que as duas respostas anteriores de Pablo Barrera e CopsOnRoad são enganosas, porque a verdade é que isso realmente não importa e você não precisa procurar muito.
As únicas ações que super.initState
e executadas super.dispose
na State
própria classe são asserções e como as assert
declarações são avaliadas apenas no modo de depuração , isso não importa de todo quando você cria o aplicativo, ou seja, no modo de produção.
A seguir, orientarei você sobre o que fazer super.initState
e o que é, todo o código que será executado quando você não tiver mixins adicionais.super.dispose
State
initState
Vejamos exatamente qual código é executado super.initState
primeiro ( fonte ):
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Como você pode ver, existe apenas uma asserção de ciclo de vida e o objetivo é garantir que seu widget funcione corretamente. Então, enquanto você chama super.initState
em algum lugar em seu próprio initState
, você verá um AssertionError
, se o seu widget não está funcionando como deveria. Não importa se você tomou alguma ação anterior, pois o assert
objetivo é apenas informar que alguma coisa no seu código está errada e você verá isso mesmo se chamar super.initState
no final do seu método.
dispose
O dispose
método é análogo ( fonte ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Como você pode ver, ele também contém apenas asserções que lidam com a verificação do ciclo de vida da depuração . O segundo assert
aqui é um bom truque, pois garante que _debugLifecycleState
apenas seja alterado no modo de depuração (pois as assert
instruções são executadas apenas no modo de depuração).
Isso significa que, desde que você chame em super.dispose
algum lugar no seu próprio método, você não perderá nenhum valor sem os mixins adicionarem funcionalidade adicional.
initState()
métodoassert(...)
, então qual é o benefício de chamar osuper.initState()
aplicativo de produção?mustCallSuper
esse método há mais de dois anos desde que o Flutter passou a existir. Qual é o benefício de colocá-lo lá, senhor?mixin
, ainda haverá uma única declaração,initState
ou sejaassert(...)
, qual é o significado de chamarsuper.initState()
um aplicativo de produção?super.initState()
deve sempre ser a primeira linha do seuinitState
método.Dos documentos:
fonte
Como você pode ver nas classes da estrutura, você deve fazer tudo depois que o widget for inicializado, ou seja, depois
super.initState()
.O caso de descartar seria logicamente de outra maneira, primeiro faça tudo e depois ligue
super.dispose()
.fonte
O initState é chamado por padrão sempre que um novo widget com estado é adicionado a uma árvore de widgets. Agora, o super.initState executa a implementação padrão da classe base do seu widget. Se você chamar qualquer coisa antes do super.initState que depende da classe base, isso poderá causar problemas. É por isso que é recomendável que você chame initState desta maneira:
fonte
dispose
é o contrário. A estrutura espera que você liguesuper.dispose
no final , mas a recomendação está correta.