🕓 Preparar, construír e liberar
O ciclo de vida describe os momentos polos que pasa un State. Para empezar, precisamos estes métodos:
| Método | Cando se executa? | Para que o usamos? |
|---|---|---|
initState | Unha 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. |
build | Ao construír a interface e nas reconstrucións posteriores. | Devolver os widgets que se deben mostrar. |
dispose | Cando 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:

🔍 Como funciona o exemplo?
O funcionamento da aplicación é o seguinte:
Inicializamos os datos (
initState): o nome inicial chega a través do construtor (widget.nomeInicial). EninitState, utilizamos ese valor para crear oTextEditingControllere inicializar a variable_nomeGardado.Mostramos a interface (
build): oTextFieldutiliza 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.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.texte utilizamossetStatepara actualizar_nomeGardadoe reconstruír a interface co novo nome.Liberamos os recursos (
dispose): cando oStatese 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:
initStatepermite inicializar datos e preparar recursos.buildconstrúe a interface e pode executarse varias veces.disposelibera os recursos cando oStatese elimina definitivamente.Non debemos crear un
TextEditingControllerdentro debuild, xa que este método pode executarse varias veces.📚 Consulta: