1
This commit is contained in:
@@ -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();
|
||||
}());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user