SafeArea en Flutter
Adapta tu interfaz a notches, status bars y áreas inseguras de los dispositivos
Descargar Ejemplos Completos¿Qué es SafeArea?
El widget SafeArea en Flutter es esencial para crear interfaces que se adapten correctamente a diferentes dispositivos, especialmente aquellos con notches, status bars y áreas inseguras.
Sin SafeArea
El contenido se superpone con áreas inseguras
Con SafeArea
El contenido respeta las áreas seguras
Problemas que resuelve SafeArea:
- ✅ Evita superposición con notches y cámaras
- ✅ Respeta la status bar del sistema
- ✅ Adapta contenido a diferentes formas de pantalla
- ✅ Compatibilidad con iOS y Android modernos
- ✅ Manejo automático de insets del sistema
¿Cuándo usar SafeArea?
Dispositivos con Notch
iPhone X+ y Android modernos con cámaras en la pantalla
Status Bar
Para evitar que el contenido se superponga con la barra de estado
Navigation Bar
En dispositivos con barras de navegación gestual
Tablets y Formas Raras
Dispositivos con relaciones de aspecto no convencionales
Implementación Básica
Uso más simple de SafeArea
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SafeArea Example',
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
Container(
color: Colors.blue,
padding: const EdgeInsets.all(16),
child: const Text(
'Contenido seguro',
style: TextStyle(color: Colors.white, fontSize: 18),
),
),
Expanded(
child: Container(
color: Colors.grey[200],
child: const Center(
child: Text('Resto del contenido'),
),
),
),
],
),
),
);
}
}
Propiedades de SafeArea
child
Widget hijo que será envuelto por el área segura
Tipo: Widget
Requerido: Sí
left
Incluir padding en el lado izquierdo
Tipo: bool
Por defecto: true
top
Incluir padding en la parte superior
Tipo: bool
Por defecto: true
right
Incluir padding en el lado derecho
Tipo: bool
Por defecto: true
bottom
Incluir padding en la parte inferior
Tipo: bool
Por defecto: true
minimum
Padding mínimo adicional a aplicar
Tipo: EdgeInsets
Por defecto: EdgeInsets.zero
maintainBottomViewPadding
Mantener el padding inferior al cambiar orientación
Tipo: bool
Por defecto: false
Ejemplos Visuales
1. SafeArea Básico vs Sin SafeArea
// ❌ SIN SafeArea - Problemas de superposición
Scaffold(
body: Column(
children: [
Container(
color: Colors.blue,
child: Text('Este texto puede superponerse'),
),
],
),
)
// ✅ CON SafeArea - Contenido seguro
Scaffold(
body: SafeArea(
child: Column(
children: [
Container(
color: Colors.blue,
child: Text('Este texto es seguro'),
),
],
),
),
)
2. Control por Lados Individuales
SafeArea personalizado
top: false, left: true, right: true
SafeArea(
top: false, // No aplicar padding superior
left: true, // Aplicar padding izquierdo
right: true, // Aplicar padding derecho
bottom: true, // Aplicar padding inferior
child: Container(
color: Colors.white,
child: Center(
child: Text('SafeArea personalizado'),
),
),
)
3. SafeArea con Padding Mínimo
Padding mínimo adicional
minimum: EdgeInsets.all(20)
SafeArea(
minimum: const EdgeInsets.all(20.0),
child: Container(
color: Colors.green[100],
child: Center(
child: Text(
'Con padding mínimo adicional',
textAlign: TextAlign.center,
),
),
),
)
Casos de Uso Comunes
📱 Pantalla Completa con AppBar
Scaffold(
appBar: AppBar(title: Text('Mi App')),
body: SafeArea(
child: ListView(
children: [
// Tu contenido aquí
],
),
),
)
🎨 Pantalla Sin AppBar
Scaffold(
body: SafeArea(
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(...),
),
child: Center(
child: Text('Pantalla completa segura'),
),
),
),
)
📐 Diseño Personalizado por Lados
SafeArea(
top: false, // Sin padding superior
bottom: false, // Sin padding inferior
left: true, // Con padding izquierdo
right: true, // Con padding derecho
child: Row(
children: [
// Contenido con padding lateral
],
),
)
Demo Interactivo de SafeArea
Contenido de Ejemplo
Este texto se ajusta según la configuración de SafeArea
// El código se generará aquí
Mejores Prácticas
✅ Lo que SÍ debes hacer
- Usa SafeArea en pantallas fullscreen sin AppBar
- Considera el notch en diseños para iOS
- Prueba en diferentes dispositivos y orientaciones
- Usa top: false cuando tengas un AppBar
- Combina con MediaQuery para casos complejos
❌ Lo que NO debes hacer
- No uses SafeArea dentro de un AppBar
- No asumas que todos los dispositivos tienen las mismas áreas inseguras
- No olvides probar en orientación landscape
- No uses valores fijos de padding en lugar de SafeArea
- No ignores el padding inferior en dispositivos con navigation bar gestual
Tip Profesional
Para casos avanzados donde necesites más control sobre los insets del sistema, combina SafeArea con MediaQuery.of(context).padding para obtener valores específicos y crear layouts más personalizados.
Ejercicios para Practicar
Ejercicio 1: App de Galería Fullscreen
Crea una app de galería de fotos que ocupe toda la pantalla respetando las áreas seguras.
Requisitos: Sin AppBar, imágenes a pantalla completa, gestos de navegación
Ejercicio 2: Player de Música
Implementa un reproductor de música con controles en la parte inferior que no se superpongan con la barra de navegación.
Requisitos: Controles fijos abajo, artwork centrado, información de la canción
Ejercicio 3: Chat Personalizado
Crea una interfaz de chat donde los mensajes respeten los bordes pero el input esté siempre accesible.
Requisitos: Burbujas de chat, input fijo, sin superposición con teclado
Solución de Problemas Comunes
❌ El contenido aún se superpone
Solución: Verifica que SafeArea esté en la posición correcta del árbol de widgets
// Correcto: SafeArea envuelve el contenido principal
Scaffold(
body: SafeArea(child: MyContent()),
)
❌ Demasiado espacio en blanco
Solución: Usa propiedades individuales (top, bottom, etc.) para controlar qué lados tienen padding
SafeArea(
top: false, // Solo aplica padding donde sea necesario
child: Content(),
)
❌ No funciona en landscape
Solución: SafeArea se adapta automáticamente, pero verifica tu implementación de orientación
// SafeArea funciona en ambas orientaciones
// Pero puedes necesitar lógica adicional para layouts específicos
Recursos Adicionales
📚 Documentación Oficial
Consulta la documentación completa de SafeArea en flutter.dev
Ver Documentación💡 Ejemplos Avanzados
Descubre implementaciones creativas con SafeArea y MediaQuery
Explorar Ejemplos