// lib/widgets/global_mini_player.dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../services/audio_service.dart'; import '../main.dart'; class GlobalMiniPlayer extends StatelessWidget { const GlobalMiniPlayer({super.key}); @override Widget build(BuildContext context) { // ⭐ 用 Selector 只监听 currentSong(低频变化) final song = context.select((s) => s.currentSong); // ⭐ 只监听播放状态(低频变化) final isPlaying = context.select((s) => s.isPlaying); final bottomPadding = MediaQuery.of(context).padding.bottom; return Stack( clipBehavior: Clip.none, children: [ Positioned( left: 0, right: 0, bottom: 0, child: Container( height: 56 + bottomPadding, color: const Color(0xFF1A1F1E), ), ), Positioned( left: 0, right: 0, bottom: bottomPadding, child: ClipRRect( borderRadius: const BorderRadius.vertical( bottom: Radius.circular(16), ), child: Container( height: 56, color: const Color(0xFF1A1F1E), child: Material( color: Colors.transparent, child: InkWell( onTap: () { if (song != null) { navigatorKey.currentState?.pushNamed('/player'); } }, highlightColor: Colors.white.withOpacity(0.05), splashColor: Colors.white.withOpacity(0.1), child: Row( children: [ const SizedBox(width: 12), Container( width: 40, height: 40, decoration: BoxDecoration( color: song != null ? const Color(0xFF2A3332) : Colors.grey[800], borderRadius: BorderRadius.circular(4), ), child: Icon( song != null ? Icons.music_note : Icons.music_off, color: song != null ? Colors.white38 : Colors.grey[600], size: 20, ), ), const SizedBox(width: 12), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( song != null ? song.title : '清听', style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Colors.white, decoration: TextDecoration.none, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), Text( song != null ? song.artist : '未播放', style: TextStyle( fontSize: 12, color: song != null ? Colors.grey[400] : Colors.grey[600], decoration: TextDecoration.none, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ], ), ), IconButton( icon: Icon( song != null && isPlaying ? Icons.pause : Icons.play_arrow, color: song != null ? Colors.white : Colors.grey[600], size: 24, ), onPressed: () { if (song != null) { context.read().togglePlay(); } }, ), IconButton( icon: const Icon( Icons.playlist_play_outlined, color: Colors.grey, size: 24, ), onPressed: () { if (song != null) { navigatorKey.currentState?.pushNamed('/playlist'); } }, ), const SizedBox(width: 4), ], ), ), ), ), ), ), ], ); } }