Files
QingTing-Player/lib/widgets/global_mini_player.dart
T
lxh2875931338 f2b4d1f46d 通知中心封面图显示
部分界面的信息更新
缓存系统初步引入
即将进入播放列表更新
2026-08-25 23:09:17 +08:00

154 lines
5.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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<AudioService, Song?>((s) => s.currentSong);
final isPlaying = context.select<AudioService, bool>((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<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),
],
),
),
),
),
),
),
],
);
}
}