fix(playback): 播放页/迷你播放器立即显示已有封面,不再等元数据流程

原因有两层:
1) Song 模型没有封面路径,播放时只带 url/title/artist,
   播放页只能等元数据服务返回 artwork 字节后才显示;
2) 元数据回来后用新 Song 覆盖当前歌曲时丢了 artworkPath,
   即使带上了也会被冲掉。

- Song 增加 artworkPath 字段
- PlaybackController / 首页收藏 / playPlaylist 构造 Song 时带上
- 播放页:artwork 字节优先,其次直接读 artwork_path 文件
- 迷你播放器同样加 FileImage 兜底
- 元数据更新重建 Song 时保留 artworkPath

真机验证:点击播放后封面立即出现,不再先显示音符占位。
This commit is contained in:
2026-11-01 16:15:49 +08:00
parent a927e3dd44
commit 708ab91ccb
5 changed files with 48 additions and 11 deletions
+8
View File
@@ -32,12 +32,17 @@ class Song {
final String? url;
final Uint8List? artwork;
/// 本地封面文件路径(songs.artwork_path)。
/// 命中过元数据的歌直接用它显示封面,不必等元数据流程回来。
final String? artworkPath;
Song({
required this.id,
required this.title,
required this.artist,
this.url,
this.artwork,
this.artworkPath,
});
Map<String, dynamic> toJson() => {
@@ -299,6 +304,7 @@ class AudioService extends ChangeNotifier {
final path = dbSong['remote_path'] as String;
songs.add(Song(
id: path,
artworkPath: dbSong['artwork_path'] as String?,
title: dbSong['title'] as String? ?? '',
artist: dbSong['artist'] as String? ?? '未知艺术家',
url: WebDAVService.instance.getFileUrl(path),
@@ -855,6 +861,8 @@ class AudioService extends ChangeNotifier {
artist: metadata.artist.isNotEmpty ? metadata.artist : song.artist,
url: song.url,
artwork: metadata.artwork,
// 保留封面文件路径:元数据流程回来前,播放页靠它立即显示封面
artworkPath: song.artworkPath,
);
_queue[_currentIndex] = updatedSong;
_currentSong = updatedSong;