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 constanteEste 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ónLas 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