Plantilla base para apps Flutter: estructura, providers, API y widgets listos para copiar y empezar un proyecto nuevo. Package com.arcaelas.hi. La app compila y corre tal cual con credenciales placeholder: arranca en modo fallback (sin login, Firebase no configurado).
- FlutterWind para estilos:
.className('...')con clases Tailwind. EvitarTextStyle/Container(color:)manual cuando exista equivalente. - Providers estáticos (sin riverpod/bloc): clases con
init/get/set/sub. - Router propio (
lib/widget/route/): árbol declarativo + stackOffstage; sin go_router. - API con backend simulado (
lib/lib/http/): interceptores por pathname; las rutas registradas conAPI.use.*resuelven local y el resto viaja albase_url.
lib/
├── main.dart # init de providers por nivel + gating (login/shell) + tema
├── assets/ # icons/ (logo.svg) · sounds/
├── lib/ # PROVIDERS globales
├── widget/ # WIDGETS globales reutilizables
└── view/ # VISTAS content-only
Regla transversal (recursiva en cualquier nivel): cada módulo/widget/view es una carpeta con main.dart. Los imports van solo hacia arriba (propio lib/, padre, raíz). Nunca entre hermanos. Sin carpetas models/utils/helpers/constants/.
- L0 (sin deps):
preferences,events,network,http. - L1 (→ Preferences):
theme,lang,notification. - L2 (→ Preferences/Lang):
sound(TTS),microphone(STT). - Features:
location(GPS),deeplink(App Links),app_lock(biometría). - Dominios del API (
lib/lib/http/lib/):example(/ping),auth(/v1/*).
El orden de init() en main.dart respeta estas dependencias.
Vistas: home (hola mundo + demo /ping) · settings (showcase de providers) · about · login (gating previo al shell). Widgets globales: route, bottom_nav, session, splash, lock_gate, toast_overlay, alert, input, primary_button, pressable, app_image.
flutter pub get
flutter run --hot
flutter analyzeEl package es com.arcaelas.hi. Para un proyecto nuevo:
pubspec.yaml→name:ydescription:.android/app/build.gradle.kts→applicationIdynamespace.android/app/src/main/kotlin/com/arcaelas/hi/MainActivity.kt→ mover a tu paquete.ios/Runner.xcodeproj→PRODUCT_BUNDLE_IDENTIFIER.- Imports Dart
package:hi/...→package:<name>/....
Sin esto la app corre en fallback: entra directo al shell, sin login.
dart pub global activate flutterfire_cli
flutterfire configureManual: reemplaza android/app/google-services.json (hay un dummy válido) y agrega ios/Runner/GoogleService-Info.plist. Server client id de Google si tu plataforma lo requiere:
flutter run --dart-define GOOGLE_SERVER_CLIENT_ID=xxxx.apps.googleusercontent.comflutter run --dart-define API_URL=https://tu-api.comEl default es https://api.example.com; sin backend real, el simulado responde las rutas registradas.
- Android: INTERNET, ACCESS_NETWORK_STATE, ubicación (fine/coarse), RECORD_AUDIO, POST_NOTIFICATIONS.
- iOS: ubicación, micrófono, reconocimiento de voz.
No commitees keys reales. Usa --dart-define, gradle.properties (gitignored) y los archivos de Firebase fuera del control de versiones para credenciales de producción.