5.2 KiB
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.42requiere:^0.1.14→ ≥0.1.14 <0.2.0audio_service 0.18.15requiere:^0.1.20→ ≥0.1.20 <0.2.0pubspec.yamldeclara:^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_sessionrequiere>=0.1.24 <0.3.0con 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.0por ahora: requiere actualización decompileSdken Android y puede romper el CI - Necesitará
ad_unit_idreal 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:
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.