No Flutter, tudo é um componente, e esses componentes podem ser classificados como StatefulWidget (com estado) ou StatelessWidget (sem estado). A principle diferença entre eles é que os StatelessWidget precisam criar novas instâncias sempre que ocorre uma alteração, enquanto os StatefulWidget podem modificar o estado atual sem a necessidade de recriar o componente.
O ciclo de vida dos componentes Stateful é crucial para entender como o Flutter gerencia as alterações de estado e interações com a interface do usuário. Este artigo explora detalhadamente cada fase desse ciclo.
Fase 1: Construção do Estado
Quando um StatefulWidget é inserido na árvore de widgets, o primeiro método chamado pelo framwork é o createState. Esse método retorna uma instância da classe State associada ao widget.
class MeuComponenteStateful extends StatefulWidget {
@override
_MeuEstado createState() => _MeuEstado();
}
class _MeuEstado extends State<MeuComponenteStateful> {
@override
Widget build(BuildContext context) {
return Container();
}
}
Após essa etapa, o atributo mounted é definido como true, indicando que o componente foi inserido na árvore.
Fase 2: Inicialiazção
O método initState é invocado após o widget ser inserido na árvore. É aqui que você deve realizar inicializações importantes, como configurações de estado ou subscrições de eventos.
@override
void initState() {
super.initState();
// Realizar inicializações específicas
}
Lembre-se de sempre chamar super.initState() antes de qualquer outra operação.
Fase 3: Alteração de Dependências
O método didChangeDependencies é acionado após initState e sempre que as dependências do widget mudam (por exemplo, se ele depende de um InheritedWidget).
@override
void didChangeDependencies() {
super.didChangeDependencies();
final tema = Theme.of(context);
print('Tema atualizado: $tema');
}
Essa fase permite que você responda a mudanças em dependências externas antes de reconstruir o widget.
Fase 4: Construção
O método build é responsável por descrever a interface do usuário do widget. Ele pode ser chamado várias vezes durante o ciclo de vida do widget, como após chamadas de setState.
@override
Widget build(BuildContext context) {
return Text('Olá, Flutter!');
}
Certifique-se de manter esse método leve e evitar lógica complexa nele.
Fase 5: Atualização de Configuração
O método didUpdateWidget é chamado quando o widget é reconstruído com um novo objeto do mesmo tipo.
@override
void didUpdateWidget(covariant MeuComponenteStateful oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.configuracao != widget.configuracao) {
// Atualizar estado conforme necessário
}
}
Use essa fase para comparar o estado anterior com o atual e tomar ações apropriadas.
Fase 6: Desativação
O método deactivate é chamado quando o widget é removido da árvore, mas pode ser reutilizado em outro lugar.
Fase 7: Liberação de Recursos
Por fim, o método dispose é chamado quando o widget é permanentemente removido da árvore. Aqui, você deve liberar recursos, como controles ou animações.
@override
void dispose() {
_controlador.dispose();
super.dispose();
}
A propriedade mounted será definida como false após essa fase, indicando que o widget não está mais ativo.