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) { final audioService = context.watch(); final song = audioService.currentSong; 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), // ⭐ 用 Material 包裹 InkWell,获得更好的点击反馈 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 && audioService.isPlaying ? Icons.pause : Icons.play_arrow, color: song != null ? Colors.white : Colors.grey[600], size: 24, ), onPressed: () { if (song != null) { audioService.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), ], ), ), ), ), ), ), ], ); } }