144 lines
5.2 KiB
Markdown
144 lines
5.2 KiB
Markdown
# 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.*
|