Saltar al contenido principal

Andamiaje, Layout y Composición en Flutter

En esta sesión aprenderás a maquetar vistas móviles en Flutter: estructurar el andamiaje (Scaffold y SafeArea), distribuir elementos en pantalla (Column, Row, Expanded), aplicar estilos visuales (Container y Padding), y solucionar desbordes (RenderFlex overflow) con SingleChildScrollView.


1. Convención Arquitectural: Screen frente a Page

En Flutter, una pantalla bien estructurada separa el marco exterior del contenido interno:

  • Screen (Pantalla de Ruta): Unidad a la que se navega. Es la única responsable de devolver el Scaffold (con su AppBar, BottomNavigationBar o FloatingActionButton).
  • Page (Lienzo Interno): Contenido visual que vive dentro del body de la Screen. Nunca debe devolver un Scaffold, solo widgets de layout (SafeArea, Column, ListView, etc.).

Arquitectura Screen vs Page

¿Por qué nunca anidar Scaffolds?

Tener un Scaffold dentro de otro genera conflictos graves: las notificaciones (SnackBar) se tapan o no se muestran, aparecen barras superiores dobles (AppBar) y el teclado virtual tapa los campos de texto porque ambos Scaffold intentan redimensionarse al mismo tiempo (resizeToAvoidBottomInset).


2. Andamiaje y Hardware: Scaffold y SafeArea

Los dispositivos móviles tienen notch, esquinas redondeadas, cámaras frontales y barras de navegación por gestos. Scaffold y SafeArea garantizan que tu interfaz no quede tapada por estos elementos físicos:

  • Scaffold: Provee los espacios estándar de Material Design (appBar, body, floatingActionButton, bottomNavigationBar).
  • SafeArea: Agrega automáticamente el margen interno necesario para proteger el contenido frente a la barra de estado superior y la barra de inicio o gestos inferior.

Protección con SafeArea


3. Layout Lineal: Row y Column

Para organizar elementos en una sola dirección utilizamos Row (horizontal) y Column (vertical). Cada uno opera sobre dos ejes coordenados:

Ejes de Row y Column

Alineaciones en Eje Principal y Transversal:

Alineaciones Visuales en Row y Column

4. Distribución Responsiva: Expanded y flex

En lugar de calcular anchos fijos o usar porcentajes manuales con MediaQuery, usamos Expanded para que un hijo absorba el espacio disponible restante:

  • Espacio flexible: Si combinas cajas fijas (ej. 70px) con Expanded, el widget flexible se adapta automáticamente a cualquier ancho de pantalla.
  • Proporciones con flex: Al colocar varios Expanded, el factor flex reparte el espacio proporcionalmente (por ejemplo, flex: 1 y flex: 2 reparten 33.3% y 66.6% del espacio sobrante).

Expanded y Proporciones flex


5. Cajas y Estilos: Container frente a Padding

Padding es un widget liviano de responsabilidad única para espaciado. Container es la navaja suiza que combina dimensiones, márgenes y decoraciones complejas:

Modelo de Caja y Regla BoxDecoration

Regla de Oro de BoxDecoration

Si usas decoration: BoxDecoration(...), el color de fondo debe ir dentro de BoxDecoration. Si colocas color en el Container al mismo tiempo que decoration, Flutter lanzará un error fatal en tiempo de ejecución ('color == null || decoration == null').


6. Prevención de Desbordes: SingleChildScrollView

Cuando el contenido de una Column supera la altura física de la pantalla, Flutter muestra las temidas rayas diagonales amarillas y negras (RenderFlex overflowed).

RenderFlex Overflow y Solución con Scroll


Cuestionario de Autoevaluación

Cargando cuestionario...