This commit is contained in:
lz_db
2026-10-25 13:26:40 +08:00
parent 494f667719
commit 7fae7387f5
6 changed files with 111 additions and 37 deletions
+20 -13
View File
@@ -130,23 +130,30 @@ class _FeedScreenState extends ConsumerState<FeedScreen>
.read(feedProvider(_strategy).notifier)
.events
.listen(_handleEvent);
// 保留每个策略的播放进度(currentIndex 由 provider 维护):切回时跳到上次位置而非归零
final targetIndex = ref.read(feedProvider(_strategy)).currentIndex;
if (_pageController.hasClients && targetIndex > 0) {
_pageController.jumpToPage(targetIndex);
} else if (_pageController.hasClients) {
_pageController.jumpToPage(0);
}
// jumpToPage 后 resume + rebindCurrent:suspend 已 stop 槽位,仅 play
// 播不起来,必须 rebind 重新 open(有断点记录则 seek 续播)
ActionLogger.I.log('feed_switch_strategy', page: '/home', detail: {
'to': next.name,
'target': targetIndex,
'liked': ref.read(feedProvider(FeedStrategy.liked)).currentIndex,
'viewed': ref.read(feedProvider(FeedStrategy.viewed)).currentIndex,
});
// 必须等新策略的 PageView 重建完成后再跳页:同步 jumpToPage 触发的是
// 旧 PageView 的 onPageChanged(回调仍指向旧策略 notifier),会把旧策略的
// currentIndex 改成 0,导致切回时从第 1 条开始播
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
unawaited(() async {
final n = ref.read(feedProvider(_strategy).notifier);
await n.pool.resume();
await n.rebindCurrent();
}());
if (!mounted) return;
if (_pageController.hasClients) {
_pageController.jumpToPage(targetIndex);
}
// jumpToPage 后 resume + rebindCurrent:suspend 已 stop 槽位,仅 play
// 播不起来,必须 rebind 重新 open(有断点记录则 seek 续播)
unawaited(() async {
final n = ref.read(feedProvider(_strategy).notifier);
await n.pool.resume();
await n.rebindCurrent();
}());
});
}