diegoRodicio

View Categories

🕓 Ciclo de vida do State

🕓 Preparar, construír e liberar

O ciclo de vida describe os momentos polos que pasa un State. Para empezar, precisamos estes métodos:

MétodoCando se executa?Para que o usamos?
initStateUnha soa vez, cando se crea o estado do widget e antes do primeiro build.Inicializar datos e preparar recursos que necesitamos durante o funcionamento do widget.
buildAo construír a interface e nas reconstrucións posteriores.Devolver os widgets que se deben mostrar.
disposeCando ese State se elimina definitivamente.Liberar recursos que creamos, como controladores.

Se unha pantalla se abre de novo cun estado novo, ese novo obxecto terá a súa propia chamada a initState. Nos exemplos, chamamos a super.initState() ao comezo e a super.dispose() ao final.

✏️ Exemplo: editar un nome

TextField permite escribir texto. Un TextEditingController garda ese texto e permítenos consultalo con .text. Agora só necesitamos esas dúas ideas; desenvolveremos os campos e formularios no Tema 3.5.

Creamos o controlador en initState e liberámolo en dispose. Non o creamos dentro de build, porque se executa varias veces e poderiamos perder a edición e deixar recursos sen liberar.

🔗 DartPad:

Editar e gardar un nome cun controlador inicializado e liberado no State
Editar e gardar un nome cun controlador inicializado e liberado no State

🔍 Como funciona o exemplo?

O funcionamento da aplicación é o seguinte:

  1. Inicializamos os datos (initState): o nome inicial chega a través do construtor (widget.nomeInicial). En initState, utilizamos ese valor para crear o TextEditingController e inicializar a variable _nomeGardado.

  2. Mostramos a interface (build): o TextField utiliza o controlador para mostrar o nome inicial e permitir que o usuario o modifique. Debaixo aparece o botón Gardar e o último nome gardado.

  3. Gardamos os cambios (setState): mentres escribimos, o controlador mantén actualizado o texto do campo. Cando prememos o botón Gardar, consultamos ese texto mediante _controlador.text e utilizamos setState para actualizar _nomeGardado e reconstruír a interface co novo nome.

  4. Liberamos os recursos (dispose): cando o State se elimina definitivamente, chamamos a _controlador.dispose() para liberar os recursos utilizados polo controlador.


💡 Para que serve late?

No exemplo declaramos dous atributos utilizando late:

late final TextEditingController _controlador;
late String _nomeGardado;

A palabra clave late permite declarar unha variable sen inicializala inmediatamente, xa que lle asignaremos un valor máis adiante, antes de utilizala.

Neste caso, inicializamos ambas as variables en initState, xa que necesitamos acceder a widget.nomeInicial.

Fíxate tamén en que _controlador se declara con final, porque queremos asignarlle un controlador unha soa vez. Pola contra, _nomeGardado non utiliza final, xa que o seu valor cambiará cada vez que premamos o botón Gardar.

Non necesitamos late cando inicializamos directamente unha variable na súa declaración, como en int _contador = 0.

💡 Lembra:

  • initState permite inicializar datos e preparar recursos.
  • build constrúe a interface e pode executarse varias veces.
  • dispose libera os recursos cando o State se elimina definitivamente.

Non debemos crear un TextEditingController dentro de build, xa que este método pode executarse varias veces.

📚 Consulta: