Ejemplo funcional completo con CupertinoApp (Diseño estilo iOS sin Material)
La alternativa oficial más sólida y utilizada frente a MaterialApp es CupertinoApp, que implementa la guía de diseño de Apple (iOS/macOS Human Interface Guidelines). A continuación se presenta un ejemplo 100% funcional y ejecutable que sustituye toda la jerarquía de Material por componentes de Cupertino.
Código Funcional Completo: main.dart con Cupertino
Sección titulada «Código Funcional Completo: main.dart con Cupertino»import 'package:flutter/cupertino.dart'; // Importa el catálogo de componentes estilo iOS de Apple
void main() { // Punto de entrada principal de la aplicación runApp(const MiAppCupertino()); // Arranca la app con el widget raíz de Cupertino} // Fin de la función main
class MiAppCupertino extends StatelessWidget { // Widget raíz inmutable que define la app const MiAppCupertino({super.key}); // Constructor constante de la clase principal
@override // Sobreescritura del método build del padre Widget build(BuildContext context) { // Retorna la estructura de la aplicación return const CupertinoApp( // Contenedor raíz con estética Cupertino title: 'Demo Cupertino iOS', // Título de la app en el administrador de tareas theme: CupertinoThemeData( // Configura el tema global de iOS brightness: Brightness.light, // Modo claro activo primaryColor: CupertinoColors.activeBlue, // Color de acento azul característico de iOS ), // Fin de CupertinoThemeData home: PantallaPrincipalCupertino(), // Pantalla de inicio de la app ); // Fin de CupertinoApp } // Fin del método build} // Fin de MiAppCupertino
class PantallaPrincipalCupertino extends StatelessWidget { // Pantalla principal de ejemplo const PantallaPrincipalCupertino({super.key}); // Constructor constante
@override // Sobreescritura del método build Widget build(BuildContext context) { // Construye la vista de la pantalla return CupertinoPageScaffold( // Andamio de pantalla equivalente al Scaffold de Material navigationBar: const CupertinoNavigationBar( // Barra de navegación superior translúcida middle: Text('Estilo iOS Nativo'), // Título centrado según el estándar de Apple ), // Fin de CupertinoNavigationBar child: SafeArea( // Garantiza que el contenido no quede tapado por el notch o barra de inicio child: Center( // Centra el contenido en pantalla child: Column( // Disposición vertical de widgets mainAxisAlignment: MainAxisAlignment.center, // Centra los elementos verticalmente children: [ // Lista de widgets hijos const Text( // Texto explicativo 'Aplicación Flutter sin Material Design', // Mensaje mostrado style: TextStyle(fontSize: 16), // Tamaño de fuente en píxeles lógicos ), // Fin de Text const SizedBox(height: 24), // Separación vertical de 24 píxeles CupertinoButton.filled( // Botón con fondo relleno característico de iOS child: const Text('Abrir Diálogo Cupertino'), // Texto del botón onPressed: () { // Callback ejecutado al pulsar el botón showCupertinoDialog( // Dispara un diálogo modal nativo de iOS context: context, // Contexto necesario para posicionar el modal builder: (context) => CupertinoAlertDialog( // Cuadro de diálogo con diseño de Apple title: const Text('Aviso de iOS'), // Título del diálogo content: const Text( // Mensaje del cuerpo del diálogo 'Este cuadro de diálogo utiliza los estilos y bordes nativos de Apple.', // Texto informativo ), // Fin de Text actions: [ // Botones de acción del diálogo CupertinoDialogAction( // Acción interactiva del diálogo isDefaultAction: true, // Destaca visualmente la acción por defecto child: const Text('Entendido'), // Texto de confirmación onPressed: () => Navigator.pop(context), // Cierra el modal emergente ), // Fin de CupertinoDialogAction ], // Fin de lista de acciones ), // Fin de CupertinoAlertDialog ); // Fin de showCupertinoDialog }, // Fin de onPressed ), // Fin de CupertinoButton.filled ], // Fin de children ), // Fin de Column ), // Fin de Center ), // Fin de SafeArea ); // Fin de CupertinoPageScaffold } // Fin del método build} // Fin de PantallaPrincipalCupertinoTabla de Equivalencias Directas: Material vs. Cupertino
Sección titulada «Tabla de Equivalencias Directas: Material vs. Cupertino»| Concepto de Interfaz | Equivalente en Material Design | Equivalente en Cupertino (iOS) |
|---|---|---|
| Raíz de la aplicación | MaterialApp(...) |
CupertinoApp(...) |
| Estructura base de pantalla | Scaffold(...) |
CupertinoPageScaffold(...) |
| Barra de navegación superior | AppBar(...) |
CupertinoNavigationBar(...) |
| Botón principal | ElevatedButton(...) o FilledButton(...) |
CupertinoButton.filled(...) |
| Diálogo modal de alerta | AlertDialog(...) |
CupertinoAlertDialog(...) |
| Indicador de carga circular | CircularProgressIndicator() |
CupertinoActivityIndicator() |
| Colección de iconos | Icons.settings |
CupertinoIcons.settings |