feat(v0.4.0): PantallaReproductor + PantallaAjustes + MiniReproductor tappable
- PantallaReproductor: artwork grande con sombra animada al reproducir, info chips (país/idioma), codec/bitrate, controles play/pause/stop, indicador en vivo, botón favorito toggle, widget timer inline, animaciones entrada (scale + fadeIn + slideY), transición slide-up. - PantallaAjustes: estado sistema (filtro, background), conteo favoritos, preview de features futuras (Export/Import, radio custom, EQ). - MiniReproductor: GestureDetector → abre PantallaReproductor al tap. - app.dart: 4 tabs (Inicio/Buscar/Favoritos/Ajustes), AppBar condicional.
This commit is contained in:
84
lib/pantallas/pantalla_ajustes.dart
Normal file
84
lib/pantallas/pantalla_ajustes.dart
Normal file
@@ -0,0 +1,84 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_radio.dart';
|
||||
|
||||
/// Pantalla de ajustes — por ahora muestra info de la app.
|
||||
/// En Fase 3 se añadirá Export/Import config y gestión PRO.
|
||||
class PantallaAjustes extends StatelessWidget {
|
||||
const PantallaAjustes({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
final estado = context.read<EstadoRadio>();
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text('Ajustes')),
|
||||
body: ListView(
|
||||
children: [
|
||||
// Info app
|
||||
ListTile(
|
||||
leading: const Icon(Icons.info_outline),
|
||||
title: const Text('PluriWave'),
|
||||
subtitle: const Text('v0.3.0 — Radio mundial'),
|
||||
),
|
||||
const Divider(),
|
||||
// Favoritos
|
||||
FutureBuilder<int>(
|
||||
future: estado.favoritos.obtenerTodos().then((l) => l.length),
|
||||
builder: (ctx, snap) => ListTile(
|
||||
leading: const Icon(Icons.favorite_outline),
|
||||
title: const Text('Favoritos guardados'),
|
||||
trailing: Text(
|
||||
snap.data?.toString() ?? '—',
|
||||
style: theme.textTheme.bodyLarge,
|
||||
),
|
||||
),
|
||||
),
|
||||
const Divider(),
|
||||
// Filtro emisoras
|
||||
ListTile(
|
||||
leading: const Icon(Icons.verified_outlined),
|
||||
title: const Text('Filtro de emisoras'),
|
||||
subtitle: const Text('Solo emisoras verificadas como activas'),
|
||||
trailing: const Icon(Icons.check_circle, color: Colors.green),
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.music_off_outlined),
|
||||
title: const Text('Audio en background'),
|
||||
subtitle: const Text('Activo — continúa al apagar pantalla'),
|
||||
trailing: const Icon(Icons.check_circle, color: Colors.green),
|
||||
),
|
||||
const Divider(),
|
||||
// Próximamente
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 12, 16, 4),
|
||||
child: Text('PRÓXIMAMENTE', style: TextStyle(fontSize: 12, letterSpacing: 1.2)),
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.upload_outlined),
|
||||
title: const Text('Exportar configuración'),
|
||||
subtitle: const Text('Favoritos, radios custom, presets EQ'),
|
||||
enabled: false,
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.download_outlined),
|
||||
title: const Text('Importar configuración'),
|
||||
enabled: false,
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.add_circle_outline),
|
||||
title: const Text('Añadir radio personalizada'),
|
||||
enabled: false,
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.equalizer_outlined),
|
||||
title: const Text('Ecualizador'),
|
||||
subtitle: const Text('5 bandas, presets por emisora'),
|
||||
enabled: false,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user