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

Por qué falla ElevatedButton(onPressed: () {}, ...) con el error Invalid constant value dentro de un bloque const

Uno de los errores más frecuentes que sufren los principiantes al añadir botones o interactividad a un layout existente en Flutter es el mensaje del analizador de Dart:

# Error emitido por el analizador estático de Dart en tiempo de compilación:
Invalid constant value # Falla porque una función anónima (closure) no es un valor constante

Este fallo suele producirse al añadir un ElevatedButton(onPressed: () {}, ...) dentro de una pantalla que anteriormente era estática. A continuación explicamos por qué sucede y cómo solucionarlo adecuadamente.

¿Por qué se produce el error Invalid constant value?

Sección titulada «¿Por qué se produce el error Invalid constant value?»

El error ocurre cuando existe la palabra clave const delante de un widget ancestro (por ejemplo, en el Scaffold, en una Row o directamente en la lista children: const [...]).

En Dart:

onPressed: () {} // Callback anónimo dinámico: se genera en memoria durante la ejecución

Las funciones en Dart (() {}) no son constantes de compilación. Por lo tanto, si la lista o el widget padre tiene const, el compilador detecta una incongruencia: “Se indicó que todo este árbol era constante, pero contiene un botón con una función o callback creado en tiempo de ejecución”.

❌ Código incorrecto que genera el error:

body: const Row( // Error: const aquí exige que absolutamente todos sus descendientes sean constantes
children: [ // Lista de widgets hijos
ElevatedButton( // Error: no puede ser constante porque su función onPressed no lo es
onPressed: () {}, // Función anónima creada en tiempo de ejecución
child: Text('Ir'), // Widget de texto hijo
), // Fin de ElevatedButton
], // Fin de children
) // Fin de Row

✅ Código corregido (retirando const del ancestro y manteniéndolo solo en widgets hijos estáticos):

body: Row( // Correcto: sin const en el padre para permitir interactividad en los hijos
children: [ // Lista de widgets hijos
ElevatedButton( // Botón interactivo sin const
onPressed: () { // Función callback ejecutada al hacer clic
print('Pulsado'); // Imprime mensaje en la consola de depuración
}, // Fin de la función anónima
child: const Text('Ir'), // El widget Text sí es inmutable y puede llevar const
), // Fin de ElevatedButton
], // Fin de children
) // Fin de Row