# Revisión Arquitectura — PluriWave Fase 1 **Arq | 2026-04-04** --- ## Decisión: stack APROBADO con ajustes menores El stack propuesto es sólido para una app de radio Flutter. Sin conflictos bloqueantes de dependencias. Sin problemas de licencia. --- ## Stack analizado | Paquete | Versión declarada | Latest | Licencia | |---------|------------------|--------|----------| | `just_audio` | `^0.9.42` | 0.10.5 | Apache-2.0 + MIT ✅ | | `audio_service` | `^0.18.15` | 0.18.18 | MIT ✅ | | `audio_session` | `^0.1.21` | 0.2.3 | N/A (OSI) ✅ | | `sqflite` | `^2.4.1` | 2.4.2 | BSD-2 ✅ | | `flutter_animate` | `^4.5.2` | 4.5.2 | BSD-3 ✅ | | `google_mobile_ads` | comentado | 7.0.0 | Apache-2.0 ✅ | --- ## Análisis de compatibilidad de versiones ### Dependencia crítica: `audio_session` Tres paquetes compiten por `audio_session`: - `just_audio 0.9.42` requiere: `^0.1.14` → ≥0.1.14 <0.2.0 - `audio_service 0.18.15` requiere: `^0.1.20` → ≥0.1.20 <0.2.0 - `pubspec.yaml` declara: `^0.1.21` → ≥0.1.21 <0.2.0 **Intersección**: ≥0.1.21 <0.2.0 → disponibles hasta 0.1.25 → **SIN CONFLICTO ✅** ### `rxdart` Ambos paquetes requieren `>=0.26.0 <0.29.0`. rxdart latest es 0.28.0. **SIN CONFLICTO ✅** ### `js` (dep transitiva de `audio_service`) `audio_service` requiere `js >=0.6.3 <0.8.0`. Esto es solo para la plataforma web. Si no hay web target, es irrelevante. Si en el futuro se añade web: aceptable, `js 0.7.2` es la latest en ese rango. --- ## Ajustes recomendados ### 🟠 1. Actualizar `just_audio` a `^0.10.0` (importante) `just_audio 0.9.x` está en mantenimiento. La rama `0.10.x` (latest: 0.10.5) tiene: - Soporte Flutter ≥3.27.0 (el runner macmini-flutter probablemente lo cumple) - API compatible para streaming de radio (URLs HTTP/HTTPS directas) - `audio_session` requiere `>=0.1.24 <0.3.0` con 0.10.x — compatible con la gama completa **Acción**: cambiar `just_audio: ^0.9.42` → `just_audio: ^0.10.0` en pubspec.yaml. Si el runner tiene Flutter <3.27.0, mantener 0.9.42. ### 🟡 2. Actualizar `audio_service` a `^0.18.18` (menor) La 0.18.18 actualiza `audio_session` a `>=0.1.25 <0.3.0`, lo que permite usar versiones 0.2.x en el futuro sin romper nada. ### 🟡 3. `google_mobile_ads` — descomentarlo con cuidado Actualmente comentado (correcto para Fase 1). Cuando se active: - Usar `^5.3.0` (ya declarado) si el runner tiene Flutter ≥3.7.0 — ✅ - **Evitar `^7.0.0`** por ahora: requiere actualización de `compileSdk` en Android y puede romper el CI - Necesitará `ad_unit_id` real en secrets de CI antes de activar en release builds - Play Store requiere declarar uso de datos de anuncios en el Data Safety form ### 🔴 4. Signing config para release builds — BLOQUEANTE para CI `android/app/build.gradle.kts` tiene: ```kotlin signingConfig = signingConfigs.getByName("debug") // TODO: fix ``` Esto firma el APK/AAB release con la clave debug. **No es aceptable para Play Store**, pero sí funciona para artifacts internos de CI (distribución interna, testing). Para CI de Fase 1: aceptable como está. Para producción: añadir keystore como secret en Gitea CI y configurar signing real. --- ## Estructura de app — observación `lib/main.dart` es el scaffold por defecto de Flutter (contador demo). Los devs deberán reemplazarlo con la arquitectura real de PluriWave antes de que los tests sean útiles. Sugerencia de estructura para Fase 1: ``` lib/ ├── main.dart ├── app.dart # MaterialApp + Provider setup ├── core/ │ ├── servicios/ │ │ ├── servicio_audio.dart # just_audio + audio_service wrapper │ │ └── servicio_radio.dart # fetch streams/stations API │ └── db/ │ └── db_helper.dart # sqflite setup ├── modelos/ │ ├── emisora.dart │ └── favorito.dart └── ui/ ├── pantalla_inicio.dart ├── pantalla_reproductor.dart └── widgets/ ``` `Provider` (ya en pubspec) es correcto para este scope. No hace falta Riverpod ni Bloc para Fase 1. --- ## Licencias — veredicto | Paquete | Licencia | Uso comercial | Distribución | |---------|----------|--------------|-------------| | `just_audio` | Apache-2.0 + MIT | ✅ libre | ✅ libre | | `audio_service` | MIT | ✅ libre | ✅ libre | | `sqflite` | BSD-2 | ✅ libre | ✅ libre | | `flutter_animate` | BSD-3 | ✅ libre | ✅ libre | | `google_mobile_ads` | Apache-2.0 | ✅ (con cuenta AdMob) | ✅ libre | Sin restricciones de licencia para app comercial en Play Store. ✅ --- ## Resumen ejecutivo | Ítem | Estado | |------|--------| | Conflictos de dependencias | ✅ Ninguno | | Licencias incompatibles | ✅ Ninguna | | Stack adecuado para radio en streaming | ✅ Sí | | Signing release para Play Store | ⚠️ Pendiente (keystore) | | just_audio versión óptima | 🟠 Actualizar a ^0.10.0 si Flutter ≥3.27 | | google_mobile_ads | 🟡 Descomentarlo solo cuando haya Ad Unit IDs reales | | Estructura de código | 🟡 Scaffold vacío — devs deben estructurar lib/ | **El stack puede profundizarse sin riesgo. Sin bloqueos.** --- *Arq — revisión sin acceso al analisis.md de Obsidian (fichero no sincronizado localmente). Revisión realizada directamente desde pub.dev API + pubspec.yaml del repo.*