Scaffold es un widget central en Flutter que implementa la estructura básica de Material Design para pantallas con AppBar, Drawer, BottomNavigationBar y FloatingActionButton. No solo posiciona elementos, sino que proporciona una arquitectura lista con el orden z correcto y manejo de gestos del usuario. Según la Documentación de Flutter (2026), Scaffold es un elemento raíz obligatorio para el correcto funcionamiento de los componentes Material, incluidos SnackBar y BottomSheet. A diferencia de Container o Column, Scaffold gestiona automáticamente SafeArea, el fondo adaptativo y el comportamiento del teclado, lo que lo convierte en el estándar para construir pantallas en aplicaciones móviles.
Puntos clave
Scaffold es un widget de diseño de la biblioteca Material Design que forma la estructura visual básica de una pantalla. Implementa el patrón estándar de aplicación Material: barra superior, cuerpo de pantalla, menú lateral y botones flotantes. A diferencia de Container, que simplemente establece dimensiones y estilo, Scaffold gestiona toda la pantalla como un sistema unificado.
Toda aplicación Flutter construida con Material Design comienza con MaterialApp, dentro del cual cada pantalla se envuelve en un Scaffold. Es Scaffold quien asegura la visualización correcta de AppBar en todos los dispositivos, teniendo en cuenta SafeArea para iPhone X y superiores. También es responsable del orden z: Drawer aparece sobre body, y SnackBar aparece sobre toda la interfaz, pero debajo de las ventanas de diálogo.
Según la Referencia de la API de Flutter (2026), Scaffold es un requisito obligatorio para el correcto funcionamiento de widgets como SnackBar, BottomSheet y PersistentBottomSheet. Sin Scaffold, estos componentes lanzan una excepción porque dependen de InheritedWidget Scaffold.of para acceder al contexto de Scaffold. Por lo tanto, colocar cualquier contenido directamente en Container en lugar de Scaffold es un error común entre los desarrolladores principiantes, que lleva a la pérdida de funcionalidad Material.
En una aplicación Flutter típica, Scaffold se encuentra dentro de MaterialApp, generalmente bajo WidgetsApp o CupertinoApp en el desarrollo multiplataforma. MaterialApp crea Navigator y tema, mientras que Scaffold define la estructura de la pantalla actual. Cada pantalla puede tener su propio Scaffold con AppBar, Drawer y BottomNavigationBar únicos, lo que permite una personalización flexible de la interfaz para una página específica.
Para una personalización avanzada, Scaffold se puede combinar con NestedScrollView — esto permite implementar efectos de desplazamiento complejos, como un AppBar que se colapsa con efecto parallax. Sin embargo, en la mayoría de los casos, el Scaffold estándar con sus propiedades es suficiente para construir una pantalla lista para producción.
Scaffold consta de varias zonas obligatorias y opcionales, cada una responsable de una parte específica de la interfaz. Veamos cada parte individualmente para entender cómo interactúan entre sí.
AppBar es la barra superior de la pantalla que muestra el título, el botón de navegación y las acciones. Obtiene automáticamente la altura correcta de 56dp y tiene en cuenta SafeArea para dispositivos con muesca. Se puede incorporar TabBar en AppBar para cambiar de pestañas usando la propiedad bottom.
Drawer es un panel que se desliza desde la izquierda y proporciona navegación por las secciones de la aplicación. Scaffold añade automáticamente un icono de hamburguesa en AppBar si la propiedad drawer está establecida. Drawer puede contener DrawerHeader, ListView con elementos de menú e información del usuario.
BottomNavigationBar es un panel en la parte inferior de la pantalla para cambiar entre secciones principales. Contiene de 2 a 5 iconos con etiquetas y soporta Material 3 con indicación activa a través de NavigationBar. Scaffold lo posiciona en la parte inferior de la pantalla, desplazando automáticamente el body hacia arriba para que el contenido no se superponga.
FloatingActionButton es un botón redondo ubicado en la esquina inferior derecha de la pantalla. Se utiliza para la acción principal en la pantalla, como añadir un nuevo registro o enviar un mensaje. Scaffold soporta múltiples FAB con animación extendida a través de propiedades extended.
Body es el área central de la pantalla donde se coloca el contenido principal. Cualquier widget puede servir como body: Column, ListView, GridView, Stack o una composición personalizada. Scaffold calcula automáticamente la altura del body teniendo en cuenta AppBar, BottomNavigationBar y SafeArea, eliminando la necesidad de ajuste manual de tamaños.
Scaffold proporciona más de 30 propiedades para personalizar la apariencia y el comportamiento de la pantalla. Entre ellas hay tanto obligatorias (body) como opcionales que controlan márgenes, fondo y estado del teclado. Comprender cada propiedad ayuda a configurar con precisión la interfaz según los requisitos de diseño.
| Propiedad | Tipo | Descripción |
|---|---|---|
| appBar | PreferredSizeWidget? | Barra superior de la pantalla con título y acciones |
| body | Widget? | Contenido principal de la pantalla entre AppBar y BottomNavigationBar |
| drawer | Widget? | Panel lateral que se abre deslizando desde la izquierda |
| bottomNavigationBar | Widget? | Barra de navegación inferior (BottomNavigationBar o NavigationBar) |
| floatingActionButton | Widget? | Botón de acción flotante |
| backgroundColor | Color? | Color de fondo de Scaffold, que anula el tema |
| resizeToAvoidBottomInset | bool | Contracción automática del body cuando aparece el teclado |
La propiedad resizeToAvoidBottomInset es especialmente importante al trabajar con formularios: cuando se establece en true (por defecto), Scaffold contrae automáticamente el body cuando aparece el teclado, manteniendo visible el campo de entrada. Esto elimina la necesidad de escribir oyentes de teclado personalizados. Para escenarios personalizados con SingleChildScrollView, la propiedad se puede desactivar.
Veamos un ejemplo práctico de Scaffold con un conjunto completo de componentes Material. El código crea una pantalla con AppBar, Drawer, BottomNavigationBar, FloatingActionButton y SnackBar — una estructura típica de aplicación móvil en Flutter.
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
int selectedIndex = 0;
final List<Widget> pages = [
const HomePage(),
const SearchPage(),
const ProfilePage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('My App'),
actions: [
IconButton(icon: const Icon(Icons.search), onPressed: () {}),
],
),
body: pages[selectedIndex],
drawer: Drawer(
child: ListView(
children: [
const DrawerHeader(child: Text('Menu')),
ListTile(title: const Text('Settings'), onTap: () {}),
],
),
),
bottomNavigationBar: NavigationBar(
selectedIndex: selectedIndex,
onDestinationSelected: (int index) {
setState(() => selectedIndex = index);
},
destinations: const [
NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
NavigationDestination(icon: Icon(Icons.search), label: 'Search'),
NavigationDestination(icon: Icon(Icons.person), label: 'Profile'),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Action completed')),
);
},
child: const Icon(Icons.add),
),
);
}
}
El ejemplo utiliza NavigationBar de Material 3 en lugar del obsoleto BottomNavigationBar. Scaffold enlaza automáticamente todas las partes: cuando se abre Drawer, SnackBar se oculta; al cambiar de pestañas, body se actualiza; y FloatingActionButton permanece en su lugar. ScaffoldMessenger garantiza la visualización de SnackBar incluso con múltiples Scaffold en la jerarquía.
Material 3 (M3) es la evolución de Material Design presentada por Google en 2023. Scaffold en M3 recibió varios cambios: un nuevo widget NavigationBar en lugar de BottomNavigationBar, soporte para Color Dinámico a través de ColorScheme.fromSeed y recomendaciones actualizadas para márgenes y alturas de componentes. Cambiar a M3 no requiere reemplazar Scaffold — solo hay que actualizar el tema de la aplicación.
Para habilitar Material 3 en un proyecto, es necesario establecer useMaterial3: true en ThemeData. Scaffold adapta automáticamente el estilo visual: los márgenes se vuelven más grandes (24dp en lugar de 16dp), los colores se recalculan a partir del color semilla, y FloatingActionButton obtiene tamaños más grandes con esquinas redondeadas. Al mismo tiempo, todas las propiedades existentes de Scaffold siguen siendo funcionales.
Según la Especificación de Material Design 3 (2026), se recomienda usar NavigationBar con tres a cinco elementos en lugar de BottomNavigationBar. Scaffold soporta ambas opciones, pero NavigationBar proporciona mejor soporte para adaptabilidad y Material You en dispositivos Pixel.
Para el correcto funcionamiento de Scaffold con M3, basta con actualizar el tema y reemplazar BottomNavigationBar por NavigationBar. Los colores se calcularán automáticamente a través de ColorScheme.fromSeed, y Scaffold ajustará los márgenes a los nuevos estándares. Si es necesario, se puede anular backgroundColor directamente.
Preguntas frecuentes
Scaffold es un widget marco para una pantalla completa con soporte para componentes Material (AppBar, Drawer, SnackBar), mientras que Container es un contenedor básico para un solo elemento hijo sin gestión de estructura de pantalla. Scaffold proporciona orden z, SafeArea y manejo automático de gestos, mientras que Container solo establece dimensiones y estilo.
Técnicamente sí, pero en la práctica no se recomienda. Si anidas un Scaffold dentro de otro, el Scaffold interno creará su propio AppBar y BottomNavigationBar, lo que provocará duplicación de paneles y confusión en el orden z. Para diseños complejos, usa NestedScrollView o Column dentro del body de un solo Scaffold.
SnackBar es un componente hijo de Scaffold y requiere su presencia en el árbol de widgets para mostrarse correctamente. Scaffold proporciona ScaffoldState, a través del cual SnackBar anima su aparición y se posiciona en la parte inferior de la pantalla. Sin Scaffold, SnackBar lanza una excepción porque no puede encontrar ScaffoldState en el contexto a través de InheritedWidget.
El color de fondo de Scaffold se establece mediante la propiedad backgroundColor, que anula el color del tema para una pantalla específica. Si necesitas cambiar el fondo globalmente, establece scaffoldBackgroundColor en ThemeData. Material 3 calcula automáticamente el color de fondo a partir de ColorScheme.surface, pero se puede anular manualmente.
ScaffoldMessenger es una utilidad presentada en Flutter 2.5 que permite mostrar SnackBar y BottomSheet independientemente del Scaffold actual en la jerarquía. A diferencia del obsoleto Scaffold.of(context), ScaffoldMessenger funciona correctamente al navegar entre pantallas y no pierde el contexto durante las animaciones. Se recomienda usar siempre ScaffoldMessenger para la retroalimentación del usuario.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también