Ir al contenido

Guía de Flutter para novatos - Miguel Páramos

FAQ sobre Flutter pal que no tiene ni idea de Flutter | 2º DAM · PMDM

Métodos del ciclo de vida de un Widget ( StatelessWidget y StatefulWidget ) comparados con Android (Kotlin)

Al proceder de entornos como Android nativo con Kotlin, comprender el ciclo de vida en Flutter resulta muy intuitivo al trazar la equivalencia directa entre los eventos de una Activity o Fragment y los métodos de un widget.

Concepto en Android (Kotlin) Equivalente en Flutter
Activity / Fragment StatefulWidget + State<T>
onCreate() initState()
onCreateView() / @Composable build()
onUpdate() / invalidate() didUpdateWidget() / setState()
onDestroy() dispose()

Un StatelessWidget solo tiene un único método: build(BuildContext context).

Al carecer de estado persistente, el widget nace, se dibuja y cuando deja de formar parte del árbol o el widget ancestro se reconstruye, el recolector de basura lo destruye sin notificaciones intermedias.

En un StatefulWidget, el ciclo de vida se gestiona íntegramente dentro de la clase acompañante State<T>:

Método en Flutter Equivalente en Android Cuándo se ejecuta Para qué se usa
createState() Creación de instancia Una sola vez, al inflar el widget. Conecta el widget con su objeto de estado.
initState() onCreate() Una sola vez al nacer el widget en pantalla. Inicializar controladores (TextEditingController, animaciones), suscribirse a Streams o disparar una petición inicial. (No se puede usar context con temas aquí).
didChangeDependencies() onStart() / lectura de configuración Justo tras initState() y cada vez que cambia un InheritedWidget ancestro (ej. cambio de idioma o tema oscuro/claro). Para inicializar cosas que sí requieran leer del context (como Theme.of(context) o MediaQuery).
build() onCreateView() / Compose layout Muchas veces (al inicio y cada vez que llamas a setState()). Devolver el árbol de widgets visual. Debe ser una función pura y rápida.
didUpdateWidget() Actualización de props / onNewIntent Cuando el widget padre se reconstruye y le pasa nuevos datos a este widget hijo. Comparar el valor viejo con el nuevo (if (oldWidget.id != widget.id)) y reaccionar.
setState() notifyDataSetChanged() / invalidate() Manualmente cuando tú lo llamas. Avisa a Flutter: “he cambiado una variable, vuelve a ejecutar build() en el siguiente fotograma”.
dispose() onDestroy() Cuando el widget se elimina definitivamente de la pantalla (ej. navegación hacia atrás). Crucial: cerrar controladores (controller.dispose()), cancelar temporizadores o suscripciones para evitar fugas de memoria (memory leaks).