Aplicación Flutter de práctica que detecta la plataforma en la que se ejecuta y muestra una interfaz distinta según el caso: Material Design en Android y Cupertino en iOS. Fue creada como experimento en Project IDX (hoy Firebase Studio).
- Detección de plataforma con
dart:io(Platform.isIOS). - Versión Material (Android):
AppBar,Drawerlateral,FloatingActionButtonextendido,BottomNavigationBarcon dos pestañas (Home y Search) y botón de "me gusta". - Versión Cupertino (iOS):
CupertinoPageScaffoldconCupertinoNavigationBary un texto centrado. - Botón de "me gusta" que alterna entre corazón vacío y corazón rojo, tanto en el
AppBarcomo en el botón flotante. - Estado manejado con
StatefulWidgetysetState. - Entorno de desarrollo reproducible con
.idx/dev.nix(JDK 17, extensiones de Dart y Flutter, vistas previas web y Android).
| Tecnología | Detalle |
|---|---|
| Flutter | SDK con Dart >=3.4.0 <4.0.0 |
| Dart | 3.4 o superior |
| Material y Cupertino | Widgets incluidos en Flutter |
cupertino_icons |
^1.0.6 |
flutter_lints |
^3.0.0 (desarrollo) |
| Project IDX | Configuración en .idx/dev.nix |
- Flutter SDK (canal stable, con Dart 3.4 o superior)
- Android Studio o Xcode, según la plataforma de destino
- Un emulador, simulador o dispositivo físico
Para verificar tu entorno:
flutter doctor-
Clona el repositorio:
git clone https://github.com/<tu-usuario>/flutter_exp_idx.git cd flutter_exp_idx
-
Instala las dependencias:
flutter pub get
En un emulador o dispositivo Android:
flutter run -d androidEn un simulador o dispositivo iOS (solo macOS):
flutter run -d iosPara ver todos los dispositivos disponibles:
flutter devicesNota sobre web: el proyecto incluye la carpeta
web/y una vista previa web en.idx/dev.nix, pero la app usadart:io, cuya clasePlatformno está soportada en navegadores. Ejecutarla en web provoca un error en tiempo de ejecución. Ver Limitaciones conocidas.
flutter_exp_idx/
├── lib/
│ └── main.dart # Toda la lógica y la interfaz de la app
├── test/
│ └── widget_test.dart # Test por defecto de Flutter
├── android/ # Proyecto nativo Android
├── web/ # Archivos de la plataforma web
├── .idx/
│ └── dev.nix # Entorno de Project IDX
├── pubspec.yaml # Dependencias y configuración
└── analysis_options.yaml # Reglas de análisis estático
MyHomePage decide qué interfaz mostrar en su método build:
@override
Widget build(BuildContext context) {
return Platform.isIOS ? VersionCupertino() : VersionMaterial();
}VersionMaterial()construye unScaffoldcon navegación inferior, menú lateral y botón de "me gusta".VersionCupertino()construye unCupertinoPageScaffoldcon barra de navegación estilo iOS.
flutter testEl test incluido es el de ejemplo del contador que genera Flutter por defecto. No corresponde a esta app y falla. Ver Limitaciones conocidas.
- No funciona en web:
Platform.isIOSdedart:iolanza una excepción en navegadores. Para soportar web se puede usardefaultTargetPlatformdepackage:flutter/foundation.dart, que es multiplataforma. - Título fijo: la versión Material siempre muestra "Detected Android!", aunque se ejecute en otra plataforma que no sea iOS (por ejemplo, escritorio).
- Menú y pestañas sin lógica: los ítems del
Drawertienen unonTapvacío y la pestaña "Search" solo cambia el texto mostrado. - Test desactualizado:
test/widget_test.dartbusca un contador y un ícono+que no existen, y usaconst MyApp()aunqueMyAppno declara un constructorconst. - Identificadores por defecto: el paquete se llama
myappy elapplicationIdde Android escom.example.myapp. Cámbialos antes de publicar en una tienda. - Build de release: está firmado con las claves de debug.
- Haz un fork del repositorio.
- Crea una rama:
git checkout -b mi-mejora. - Haz tus cambios y commitea.
- Envía un pull request.
Pendiente de definir. Agrega un archivo LICENSE (por ejemplo, MIT) y actualiza esta sección.