f3d744aeedd050b4cfee72f82a1b48a66e2b5cf2
Pre-existing bug, reproduces identically before this branch's changes: _editarGrupo (pantalla_ajustes_grupos_favoritos.dart) and _editarTamanoMaximo (pantalla_ajustes_grabaciones.dart) each created a TextEditingController, awaited showModalBottomSheet, then disposed the controller immediately on resolve - racing the sheet's own close animation, which still holds a bound TextField for a couple more frames. Manifests as "A TextEditingController was used after being disposed" plus a couple of cascading framework-internal symptoms. Fix: extract each sheet's content into its own StatefulWidget (_HojaEditarGrupo, _HojaTamanoMaximo) that owns the controller in its own State. Flutter only calls State.dispose() once the widget is actually removed from the tree, i.e. after the close animation finishes, so there is no dispose-timing decision left for the caller to get wrong. _editarGrupo's own test previously suppressed the crash via a FlutterError.onError override instead of fixing it; that suppression is removed here. _editarTamanoMaximo had no coverage at all for this interaction; added it. Strict TDD: confirmed both sites fail without the fix (RED) before applying it (GREEN).
PluriWave
Radio mundial con ecualizador personalizable, reconocimiento de canciones y UI premium.
Features
- +53.000 emisoras de 238 países (Radio Browser API)
- Ecualizador por emisora — guarda tu preset favorito para cada radio
- Reconocimiento de canciones — "¿Qué suena?" sin salir de la app
- Timer de auto-apagado — perfecto para dormir
- Reproducción en segundo plano — sigue sonando con la pantalla apagada
- Favoritos — acceso rápido a emisoras preferidas
- Compartir — envía emisoras a tus amigos
- UI premium — Material You, visualizador de audio, animaciones fluidas
Monetización
- 14 días PRO gratis al instalar
- Free: radio + favoritos + timer + background (con ads)
- PRO €2.99/año: sin ads + ecualizador + reconocimiento ilimitado
Stack
- Frontend: Flutter (Android + iOS)
- Radio API: Radio Browser (gratis, +53K emisoras)
- Audio: just_audio + audio_service
- Ecualizador: just_audio equalizer (Android nativo)
- Reconocimiento: AudD API (1000 req/mes free)
- Ads: Google AdMob
- Compras: in_app_purchase
CI/CD
Workflow Gitea Actions en .gitea/workflows/ci.yml, runner macmini-flutter.
Jobs: flutter pub get → flutter test → build apk --release → build appbundle --release
Artifacts: APK y AAB guardados en Gitea con nombre pluriwave-apk-<sha> / pluriwave-aab-<sha>.
Notificaciones: Telegram al completar (éxito ✅ / fallo ❌).
Secrets necesarios en el repo:
| Secret | Uso |
|---|---|
TELEGRAM_BOT_TOKEN |
Notificaciones CI |
TELEGRAM_CHAT_ID |
Canal de destino |
Signing: build de release usa clave debug (válido para CI interno). Para Play Store se requiere keystore como secret adicional.
Desarrollador
FreeTimeLab — freetimelab.es
Licencia
MIT
Description
PluriWave — Radio mundial con ecualizador, reconocimiento de canciones y UI premium
49 MiB
Languages
Dart
86%
HTML
7.1%
Kotlin
5.1%
JavaScript
1.6%
Swift
0.1%