---
title: 🕓 Ciclo de vida do State
description: "## 🕓 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? | | --- | --- |…"
url: "https://www.drodicio.com/docs/flutter/tema-3-estado-callbacks/ciclo-de-vida/"
updated: "2026-10-12"
category: Tema 3. Estado e callbacks
---

# 🕓 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é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:
>
>
>
> - [`https://dartpad.dev/?id=74d7007345a848e480e337ac97c07b83`](https://dartpad.dev/?id=74d7007345a848e480e337ac97c07b83).

[https://dartpad.dev/embed-inline.html?id=74d7007345a848e480e337ac97c07b83](https://dartpad.dev/embed-inline.html?id=74d7007345a848e480e337ac97c07b83)

![Editar e gardar un nome cun controlador inicializado e liberado no State](https://www.drodicio.com/wp-content/uploads/2026/10/ciclo_vida.png)
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`:

```dart
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:
>
>
>
> - [State → `https://api.flutter.dev/flutter/widgets/State-class.html`](https://api.flutter.dev/flutter/widgets/State-class.html).
> - [TextEditingController → `https://api.flutter.dev/flutter/widgets/TextEditingController-class.html`](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html).
