From a927e3dd44ef4582c9975632d58395ab5460debf Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Sun, 1 Nov 2026 15:24:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(favorite):=20=E6=94=B6=E8=97=8F=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8F=98=E5=8C=96=E6=97=B6=E4=B8=BB=E9=A1=B5=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前主页收藏列表只在启动或从文件列表返回时重查, 在播放页/文件列表点红心,主页不会变。 - 新增 FavoriteEvents(songPath 事件) - 文件列表、播放页收藏/取消后 publish - 主页订阅后重新拉取收藏列表 --- lib/pages/home_page.dart | 10 ++++++++++ lib/pages/player_page.dart | 2 ++ lib/pages/webdav_file_list_page.dart | 2 ++ lib/services/favorite_events.dart | 22 ++++++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 lib/services/favorite_events.dart diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index e2e12c0..89c9ce8 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../services/audio_service.dart'; +import '../services/favorite_events.dart'; import '../services/metadata_events.dart'; import '../services/webdav_service.dart'; import '../widgets/magnetic_scroll_physics.dart'; @@ -166,6 +167,7 @@ class _HomePageState extends BaseState { int _homeTab = 0; final PageController _homePageController = PageController(); StreamSubscription? _metaSub; + StreamSubscription? _favSub; List _playlistSummaries = []; // ========== 滚动控制 ========== @@ -204,6 +206,7 @@ class _HomePageState extends BaseState { super.initState(); _scrollController = ScrollController()..addListener(_onScroll); _metaSub = MetadataEvents().stream.listen(_onMetadataUpdate); + _favSub = FavoriteEvents().stream.listen((_) => _onFavoriteChanged()); _initWebDAV(); WidgetsBinding.instance.addPostFrameCallback((_) { @@ -214,6 +217,7 @@ class _HomePageState extends BaseState { @override void dispose() { _metaSub?.cancel(); + _favSub?.cancel(); _homePageController.dispose(); _scrollController.dispose(); super.dispose(); @@ -245,6 +249,12 @@ class _HomePageState extends BaseState { } } + /// 任何位置收藏/取消收藏后,重新拉一次收藏列表 + Future _onFavoriteChanged() async { + await _loadFavoritesFromDb(); + if (mounted) safeSetState(() {}); + } + /// 元数据补全后,按 path 更新收藏列表里的对应行 void _onMetadataUpdate(MetadataUpdate update) { final index = _favorites.indexWhere((item) => item.path == update.path); diff --git a/lib/pages/player_page.dart b/lib/pages/player_page.dart index b420c3b..5ad2cb4 100644 --- a/lib/pages/player_page.dart +++ b/lib/pages/player_page.dart @@ -5,6 +5,7 @@ import 'package:provider/provider.dart'; import '../base/base_state.dart'; import '../database/song_database.dart'; import '../services/audio_service.dart'; +import '../services/favorite_events.dart'; class PlayerPage extends StatefulWidget { final VoidCallback? onClose; @@ -138,6 +139,7 @@ class _PlayerPageState extends BaseState { Future _toggleFavorite(Song song) async { try { await SongDatabase().toggleFavorite(song.id); + FavoriteEvents().publish(song.id); final favorite = await SongDatabase().isFavorite(song.id); if (!mounted) return; setState(() => _isFavorite = favorite); diff --git a/lib/pages/webdav_file_list_page.dart b/lib/pages/webdav_file_list_page.dart index 3ac004d..654f22f 100644 --- a/lib/pages/webdav_file_list_page.dart +++ b/lib/pages/webdav_file_list_page.dart @@ -7,6 +7,7 @@ import '../base/base_state.dart'; import '../controllers/playback_controller.dart'; import '../database/song_database.dart'; import '../services/audio_service.dart'; +import '../services/favorite_events.dart'; import '../services/metadata_events.dart'; import '../widgets/song_artwork.dart'; import '../widgets/add_to_playlist_sheet.dart'; @@ -92,6 +93,7 @@ class _WebDAVFileListPageState extends BaseState { final wasFavorite = _favoritePaths.contains(path); try { await SongDatabase().toggleFavorite(path); + FavoriteEvents().publish(path); if (!mounted) return; safeSetState(() { final next = {..._favoritePaths}; diff --git a/lib/services/favorite_events.dart b/lib/services/favorite_events.dart new file mode 100644 index 0000000..871e67b --- /dev/null +++ b/lib/services/favorite_events.dart @@ -0,0 +1,22 @@ +// lib/services/favorite_events.dart +import 'dart:async'; + +/// 收藏状态变化事件。 +/// +/// 文件列表、播放页都能收藏/取消收藏,主页的收藏列表需要跟着变, +/// 否则要退出重进才看得到。 +class FavoriteEvents { + static final FavoriteEvents _instance = FavoriteEvents._internal(); + factory FavoriteEvents() => _instance; + FavoriteEvents._internal(); + + final StreamController _controller = + StreamController.broadcast(); + + Stream get stream => _controller.stream; + + void publish(String songPath) { + if (songPath.isEmpty) return; + _controller.add(songPath); + } +}