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:
Kira (Agent)
2026-04-04 18:24:09 +02:00
parent 81db383a47
commit ac5ab2316f
5 changed files with 677 additions and 95 deletions

View File

@@ -5,6 +5,7 @@ import 'estado/estado_radio.dart';
import 'pantallas/pantalla_inicio.dart';
import 'pantallas/pantalla_buscar.dart';
import 'pantallas/pantalla_favoritos.dart';
import 'pantallas/pantalla_ajustes.dart';
import 'widgets/mini_reproductor.dart';
class PluriWaveApp extends StatelessWidget {
@@ -63,6 +64,7 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
PantallaInicio(),
PantallaBuscar(),
PantallaFavoritos(),
PantallaAjustes(),
];
static const _destinos = [
@@ -81,12 +83,16 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
selectedIcon: Icon(Icons.favorite),
label: 'Favoritos',
),
NavigationDestination(
icon: Icon(Icons.settings_outlined),
selectedIcon: Icon(Icons.settings),
label: 'Ajustes',
),
];
@override
void didChangeDependencies() {
super.didChangeDependencies();
// Suscribir al stream de errores → SnackBar flotante
context.read<EstadoRadio>().errorStream.listen((msg) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
@@ -102,16 +108,18 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('PluriWave'),
actions: [
IconButton(
icon: const Icon(Icons.bedtime_outlined),
tooltip: 'Timer de sueño',
onPressed: () => _mostrarTimerDialog(context),
),
],
),
appBar: _indice == 3
? null // PantallaAjustes tiene su propio AppBar
: AppBar(
title: const Text('PluriWave'),
actions: [
IconButton(
icon: const Icon(Icons.bedtime_outlined),
tooltip: 'Timer de sueño',
onPressed: () => _mostrarTimerDialog(context),
),
],
),
body: _paginas[_indice],
bottomNavigationBar: Column(
mainAxisSize: MainAxisSize.min,