Scaffold: qué es, estructura y widgets en Flutter

Autor: IT Sectr Publicado: 2026-07-02 Tiempo de lectura: 9 min

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 — un widget marco que implementa la estructura de Material Design en Flutter con AppBar, Drawer, BottomNavigationBar y FloatingActionButton
  • Body — el área central de la pantalla donde se coloca el contenido principal a través de la propiedad body
  • Drawer — un menú lateral que se abre deslizando desde la izquierda o mediante el icono de hamburguesa en AppBar
  • FloatingActionButton — un botón de acción flotante ubicado en la esquina inferior derecha según el estándar de Material Design
  • SnackBar — una notificación temporal en la parte inferior de la pantalla, invocada a través de ScaffoldMessenger para la retroalimentación del usuario

Qué es Scaffold en Flutter

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.

Scaffold en la jerarquía de widgets

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.

Estructura de Scaffold: partes clave del marco

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 — barra superior

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 — menú lateral

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 — navegación inferior

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 — botón de acción flotante

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 — contenido principal

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.

Principales propiedades de Scaffold

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.

PropiedadTipoDescripción
appBarPreferredSizeWidget?Barra superior de la pantalla con título y acciones
bodyWidget?Contenido principal de la pantalla entre AppBar y BottomNavigationBar
drawerWidget?Panel lateral que se abre deslizando desde la izquierda
bottomNavigationBarWidget?Barra de navegación inferior (BottomNavigationBar o NavigationBar)
floatingActionButtonWidget?Botón de acción flotante
backgroundColorColor?Color de fondo de Scaffold, que anula el tema
resizeToAvoidBottomInsetboolContracció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.

Ejemplo de uso de Scaffold en una aplicación

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.

dart
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.

Scaffold y Material 3: características de configuración

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.

Configuración de Scaffold para Material 3

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

¿En qué se diferencia Scaffold de Container en Flutter?

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.

¿Se pueden usar dos Scaffold en una misma pantalla?

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.

¿Por qué SnackBar no se muestra sin 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.

¿Cómo cambiar el color de fondo de Scaffold?

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.

¿Qué es ScaffoldMessenger y para qué sirve?

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

  • Scaffold — el widget marco principal en Flutter que implementa la estructura de Material Design con AppBar, Drawer, BottomNavigationBar, FloatingActionButton y body
  • AppBar — la barra superior con título, botones de acción y la posibilidad de incorporar TabBar para cambiar de pestañas
  • Drawer — un menú de navegación lateral integrado automáticamente con AppBar a través de un icono de hamburguesa
  • Body — el área central para el contenido principal, cuyo tamaño se calcula automáticamente teniendo en cuenta los paneles circundantes y SafeArea
  • ScaffoldMessenger — una API moderna para mostrar SnackBar y BottomSheet que funciona correctamente al navegar entre pantallas
  • Material 3 — Scaffold soporta completamente M3 a través del parámetro useMaterial3 y NavigationBar en lugar del obsoleto BottomNavigationBar
  • FloatingActionButton — un botón de acción flotante ubicado en la esquina inferior derecha con posibilidad de personalizar posición y animación

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.

Discutir el proyecto

Lea también