This commit is contained in:
lz_db
2026-10-24 00:04:50 +08:00
parent 1d440b2916
commit 893dfed0ed
11 changed files with 388 additions and 85 deletions
+13 -6
View File
@@ -57,13 +57,16 @@ class _FeedScreenState extends ConsumerState<FeedScreen>
super.dispose();
}
/// App 退后台挂起、回前台恢复播放(suspend/resume 防在途 open 竞态)
/// App 退后台挂起、回前台从断点续播。inactive(下拉通知栏等瞬时态)
/// 只轻量 pause 当前槽防出声;paused(真退后台)才走 suspend(stop)
/// 彻底断下载——避免瞬时 inactive 触发 stop+重载的画面闪烁
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
final notifier = ref.read(feedProvider(_strategy).notifier);
if (state == AppLifecycleState.paused ||
state == AppLifecycleState.inactive) {
if (state == AppLifecycleState.paused) {
notifier.pool.suspend();
} else if (state == AppLifecycleState.inactive) {
notifier.pool.pauseCurrent();
} else if (state == AppLifecycleState.resumed) {
// 仅在首页 Tab 可见时恢复(在"我的"等页面回前台不播)
if (ref.read(feedTabVisibleProvider)) {
@@ -99,11 +102,15 @@ class _FeedScreenState extends ConsumerState<FeedScreen>
.events
.listen(_handleEvent);
_pageController.jumpToPage(0);
// jumpToPage 触发新策略 bindWindow 后再 resume:等其在途 open 完成再播放,
// 同时解除新策略池可能残留的挂起态
// jumpToPage 后 resume + rebindCurrent:suspend 已 stop 槽位,仅 play
// 播不起来,必须 rebind 重新 open(有断点记录则 seek 续播)
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
unawaited(ref.read(feedProvider(_strategy).notifier).pool.resume());
unawaited(() async {
final n = ref.read(feedProvider(_strategy).notifier);
await n.pool.resume();
await n.rebindCurrent();
}());
}
});
}