feat(metadata): 元数据补全后主动推送界面刷新
之前标签补全后,收藏/文件列表要退出重进才显示新信息。 - 新增 MetadataEvents 事件总线(MetadataUpdate: path + songs 行) - MetadataService 写库成功后 publish - 首页收藏列表订阅:按 path 替换对应 SongItem(标题/艺术家/封面) - WebDAV 文件列表订阅:按 path 更新 _metaByPath 效果:歌曲播完标签抓取完成后,列表里的那一行自动变成标签信息, 不需要返回重进。
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../services/audio_service.dart';
|
||||
import '../services/metadata_events.dart';
|
||||
import '../services/webdav_service.dart';
|
||||
import '../widgets/magnetic_scroll_physics.dart';
|
||||
import 'webdav_setup_page.dart';
|
||||
@@ -163,6 +165,7 @@ class _HomePageState extends BaseState<HomePage> {
|
||||
/// 0 = 我的收藏,1 = 歌单列表(左右滑动切换)
|
||||
int _homeTab = 0;
|
||||
final PageController _homePageController = PageController();
|
||||
StreamSubscription<MetadataUpdate>? _metaSub;
|
||||
List<PlaylistSummary> _playlistSummaries = [];
|
||||
|
||||
// ========== 滚动控制 ==========
|
||||
@@ -240,6 +243,31 @@ class _HomePageState extends BaseState<HomePage> {
|
||||
}
|
||||
}
|
||||
|
||||
/// 元数据补全后,按 path 更新收藏列表里的对应行
|
||||
void _onMetadataUpdate(MetadataUpdate update) {
|
||||
final index = _favorites.indexWhere((item) => item.path == update.path);
|
||||
if (index < 0 || !mounted) return;
|
||||
|
||||
final row = update.row;
|
||||
final title = (row['title'] as String?)?.trim() ?? '';
|
||||
final artist = (row['artist'] as String?)?.trim() ?? '';
|
||||
final artwork = (row['artwork_path'] as String?)?.trim() ?? '';
|
||||
|
||||
final old = _favorites[index];
|
||||
safeSetState(() {
|
||||
_favorites[index] = SongItem(
|
||||
path: old.path,
|
||||
fileName: old.fileName,
|
||||
title: title.isNotEmpty ? title : old.title,
|
||||
artist: artist.isNotEmpty ? artist : old.artist,
|
||||
artworkPath: artwork.isNotEmpty ? artwork : old.artworkPath,
|
||||
sourceTag: old.sourceTag,
|
||||
metadataState: (title.isNotEmpty || old.title != null)
|
||||
? 'success'
|
||||
: 'unknown',
|
||||
);
|
||||
});
|
||||
}
|
||||
void _onScroll() {
|
||||
if (mounted) safeSetState(() {});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user