fix(alarm): improve firing and preferred station
Build & Deploy Pluriwave / Análisis de código (push) Successful in 15s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 4m15s

This commit is contained in:
2026-05-22 01:05:50 +02:00
parent 28067e392d
commit eeadcc1cc6
11 changed files with 344 additions and 18 deletions
+103
View File
@@ -54,6 +54,8 @@ class _AjustesContent extends StatelessWidget {
SizedBox(height: 12),
_SeccionGrabaciones(),
SizedBox(height: 12),
_SeccionEmisoraPreferida(),
SizedBox(height: 12),
_SeccionEmisoras(),
SizedBox(height: 12),
_SeccionBackup(),
@@ -238,6 +240,107 @@ class _SeccionEcualizador extends StatelessWidget {
}
}
class _SeccionEmisoraPreferida extends StatelessWidget {
const _SeccionEmisoraPreferida();
@override
Widget build(BuildContext context) {
final estado = context.watch<EstadoRadio>();
final favoritas = estado.listaFavoritos;
final preferida = estado.emisoraPreferida;
final opciones = _opciones(estado, preferida);
return PluriGlassSurface(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
const Icon(Icons.radio_rounded),
const SizedBox(width: 12),
Text(
'Emisora preferida',
style: Theme.of(context).textTheme.titleMedium,
),
],
),
const SizedBox(height: 8),
Text(
'Se preselecciona al crear alarmas y puede iniciarse como reproducción rápida.',
style: Theme.of(context).textTheme.bodySmall,
),
const SizedBox(height: 12),
if (opciones.isEmpty)
const ListTile(
contentPadding: EdgeInsets.zero,
leading: Icon(Icons.info_outline_rounded),
title: Text('Todavía no hay emisoras disponibles'),
subtitle: Text(
'Guardá favoritas o cargá emisoras para elegir una preferida.',
),
)
else
DropdownButtonFormField<String>(
initialValue: preferida?.uuid,
decoration: InputDecoration(
labelText:
favoritas.isEmpty
? 'Fallback automático'
: 'Favorita por defecto',
),
items: [
for (final emisora in opciones)
DropdownMenuItem<String>(
value: emisora.uuid,
child: Text(
emisora.nombre,
overflow: TextOverflow.ellipsis,
),
),
],
onChanged: (uuid) async {
final seleccion = opciones.firstWhere((e) => e.uuid == uuid);
await context.read<EstadoRadio>().cambiarEmisoraPreferida(
seleccion,
);
},
),
if (preferida != null) ...[
const SizedBox(height: 8),
Text(
favoritas.any((e) => e.uuid == preferida.uuid)
? 'Preferida actual: ${preferida.nombre}'
: 'Sin favoritas: usando automáticamente ${preferida.nombre}',
),
const SizedBox(height: 8),
Align(
alignment: Alignment.centerLeft,
child: FilledButton.tonalIcon(
icon: const Icon(Icons.play_arrow_rounded),
label: const Text('Reproducir preferida'),
onPressed:
() => context.read<EstadoRadio>().reproducirEmisoraPreferida(),
),
),
],
],
),
);
}
List<Emisora> _opciones(EstadoRadio estado, Emisora? preferida) {
final base =
estado.listaFavoritos.isNotEmpty
? estado.listaFavoritos
: estado.emisorasDisponiblesPreferencia;
final mapa = <String, Emisora>{for (final emisora in base) emisora.uuid: emisora};
if (preferida != null) {
mapa[preferida.uuid] = preferida;
}
return mapa.values.toList();
}
}
class _SeccionEmisoras extends StatelessWidget {
const _SeccionEmisoras();