← Flutter & Dart

Estado en Flutter

¿Por qué es buena práctica usar constructores `const` en los widgets de Flutter?

Ver respuesta — intenta responderla en voz alta primero

Un widget creado con const se construye una sola vez y Flutter lo reutiliza (canonicalización), en lugar de recrearlo en cada build. Además, cuando el widget padre se reconstruye, Flutter puede saltarse la reconstrucción de un subárbol const porque sabe que no cambió. Esto reduce trabajo y mejora el rendimiento.

En Flutter, build se llama muchísimas veces. Cada vez se crean widgets nuevos. Si un widget no depende de ningún dato que cambie, recrearlo una y otra vez es desperdicio.

Cuando marcas un widget como const:

  • Se crea una sola instancia que Flutter reutiliza siempre (dos const Text('Hola') son literalmente el mismo objeto en memoria).
  • Al reconstruir el padre, Flutter compara y detecta que el widget const es idéntico al anterior, así que no reconstruye ese subárbol.

Es una de las optimizaciones más fáciles y de mayor impacto: básicamente "gratis", solo hay que escribir const.

import 'package:flutter/material.dart';

class Pantalla extends StatelessWidget {
  const Pantalla({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(
      children: const [
        // Estos widgets no cambian nunca: márcalos const.
        // Flutter los crea una vez y los reutiliza en cada build.
        Text("Título fijo"),
        SizedBox(height: 8),
        Icon(Icons.star),
      ],
    );
  }
}

Si Pantalla se reconstruye 100 veces, esos tres widgets const no se recrean: se reutiliza la misma instancia.

No poder usar const porque un valor intermedio no lo permite, y no darse cuenta. Basta con que un solo hijo dependa de una variable de runtime para que el const del padre deje de ser posible. También es común olvidar const por completo: el linter de Flutter (prefer_const_constructors) suele avisarte, y conviene hacerle caso.

"Un constructor const hace que el widget se cree una sola vez y Flutter lo reutilice, en lugar de recrearlo en cada build. Además, cuando el padre se reconstruye, Flutter detecta que un subárbol const no cambió y se salta su reconstrucción. Es una optimización casi gratis: solo escribo const en los widgets que no dependen de datos cambiantes. Por eso el linter de Flutter insiste tanto con prefer_const_constructors."

Reto rápido

¿Por qué const Text('Hola') puede ser más eficiente que Text('Hola') aunque muestren lo mismo?

Ver respuesta

Porque const Text('Hola') es una constante de tiempo de compilación: Flutter crea una sola instancia y la reutiliza en cada reconstrucción, y puede saltarse la reconstrucción de ese subárbol al detectar que es idéntico. Text('Hola') sin const crea un objeto nuevo en cada build, obligando a Flutter a compararlo y potencialmente rehacer más trabajo.