Naturaleza del método build() , qué contiene el BuildContext y cómo añadir lógica antes del return
El método build() es el corazón de la interfaz de usuario en Flutter. Cada vez que Flutter necesita pintar o actualizar un widget en pantalla, invoca a este método para obtener la descripción declarativa de sus componentes visuales. A continuación analizamos su funcionamiento, la información que aporta el contexto (BuildContext) y cómo estructurar lógica antes del return.
¿Es build() un constructor?
Sección titulada «¿Es build() un constructor?»No. Los constructores siempre llevan el mismo nombre que la clase (como MainApp()). build() es un método ordinario que se hereda de la clase padre (StatelessWidget o State), y por esa razón lleva encima la anotación @override (indicando que se sobreescribe la definición base del framework por la nuestra propia).
¿Se le pasa algo más que el contexto?
Sección titulada «¿Se le pasa algo más que el contexto?»No. La firma del método está fijada estrictamente por el framework: Widget build(BuildContext context). Solo recibe ese único parámetro y devuelve un árbol de Widget.
¿Qué contiene el contexto (BuildContext)?
Sección titulada «¿Qué contiene el contexto (BuildContext)?»El context es una de las piezas angulares de Flutter: representa la coordenada o posición exacta de este widget dentro del árbol jerárquico de widgets.
Gracias a este contexto, el widget puede “mirar hacia arriba” en el árbol para consultar datos y servicios del entorno mediante métodos of(context), por ejemplo:
- El tema y colores globales:
Theme.of(context).colorScheme.primary - Las dimensiones físicas de la pantalla o ventana:
MediaQuery.of(context).size.width - Navegación entre pantallas:
Navigator.of(context).push(...) - Mostrar notificaciones emergentes:
ScaffoldMessenger.of(context).showSnackBar(...)
¿Puede tener lógica o líneas de código antes del return?
Sección titulada «¿Puede tener lógica o líneas de código antes del return?»Sí, por supuesto. Antes de devolver el widget en el return, se puede ejecutar cualquier lógica de preparación que sea sincrónica y rápida: declarar variables locales, realizar cálculos matemáticos, formatear textos o consultar propiedades del contexto:
@override // Sobreescribe el método build heredado de StatelessWidgetWidget build(BuildContext context) { // Recibe el contexto de coordenadas en el árbol final double anchoPantalla = MediaQuery.of(context).size.width; // Lee el ancho de pantalla actual final String saludo = (anchoPantalla > 600) ? 'Hola escritorio' : 'Hola móvil'; // Calcula lógica sincrónica rápida
return MaterialApp( // Configura el contenedor raíz home: Scaffold( // Lienzo base de la pantalla body: Center( // Centra el widget hijo child: Text(saludo), // Muestra la variable calculada en pantalla ), // Fin de Center ), // Fin de Scaffold ); // Fin de MaterialApp} // Fin del método build