fix(player): 修复返回首页黑屏并恢复预热

This commit is contained in:
Zhou Weidong committed 2026-10-26 16:45:00 +08:00
1 parent 6667330ce0
commit 54eb5a60a8
9 files changed
+56 -101

No files matched your search

+17 -12
View File
@@ -2,6 +2,7 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:flutter/scheduler.dart';
@@ -221,30 +222,36 @@ class PlayerLogic extends ChangeNotifier {
/// 独立播放页覆盖首页时只暂停并保存进度,首页 session 与 controller 保持存活。
Future<void> pauseForFullPlayer() async {
if (!_started) return;
_logFeedHandoff('pause');
cancelScrub();
await session.pauseForRouteHandoff();
_logFeedHandoff('paused');
await saveCurrentProgress();
}
/// 返回首页前把仍存活的 feed controller 定位到第 1 集起点。
Future<void> prepareFeedResume() async {
if (!_started) return;
await session.playbackSettled;
final player = session.active;
if (player is VideoPlayerPort && player.controller.value.isInitialized) {
await player.seekTo(Duration.zero);
}
}
/// 独立播放页关闭并恢复首页路由后,等原生播放器实际恢复再结束交接。
Future<void> resumeAfterFullPlayer() async {
if (!_started) return;
_logFeedHandoff('resume');
if (visibleIndices.isNotEmpty) {
await session.resumeForRouteHandoff();
} else {
session.setRouteVisible(false);
await session.playbackSettled;
}
_logFeedHandoff('resumed');
}
void _logFeedHandoff(String phase) {
if (!kDebugMode) return;
final player = session.active;
final video = player is VideoPlayerPort ? player : null;
debugPrint(
'[feed-session] phase=$phase session=${identityHashCode(session)} '
'index=${session.currentIndex} episode=${session.currentEpisode.id} '
'controller=${video == null ? '-' : identityHashCode(video.controller)} '
'live=${session.livePlayerCount}',
);
}
/// 串行替换首页 feed 队列;频道变化时重置到第 1 个,刷新时尽量保留当前剧。
@@ -283,7 +290,6 @@ class PlayerLogic extends ChangeNotifier {
activate: activatePlayer,
coordinator: coordinator,
waitForFrame: _waitForFrame,
warmNeighborsEnabled: !homeMode,
);
}
@@ -1230,7 +1236,6 @@ class PlayerLogic extends ChangeNotifier {
),
);
if (!isMounted()) return;
await prepareFeedResume();
await resumeAfterFullPlayer();
}