// 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 监听完整的 Song 对象(包括 artwork) 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: [ // ⭐ 背景高度从 56 改为 60 Positioned( left: 0, right: 0, bottom: 0, child: Container( height: 60 + 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: 60, // ⭐ 从 56 改为 60 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), // ⭐ 封面图容器尺寸从 40 改为 44(适配 60px 高度) Container( width: 44, height: 44, decoration: BoxDecoration( borderRadius: BorderRadius.circular(4), color: song != null ? const Color(0xFF2A3332) : Colors.grey[800], // ⭐ 如果 song.artwork 存在,显示封面图 image: song?.artwork != null ? DecorationImage( image: MemoryImage(song!.artwork!), fit: BoxFit.cover, ) : null, ), child: song?.artwork == null ? Icon( song != null ? Icons.music_note : Icons.music_off, color: song != null ? Colors.white38 : Colors.grey[600], size: 20, ) : null, ), 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), ], ), ), ), ), ), ), ], ); } }