fix(home): 首切频道预取并保留播放画面

This commit is contained in:
Zhou Weidong committed 2026-10-21 17:53:58 +08:00
1 parent dfa79bed88
commit 677e49fa6e
5 files changed
+242 -27

No files matched your search

@@ -52,6 +52,14 @@ class HomeFeedController extends ChangeNotifier {
_notifyIfCurrent(HomeFeedChannel.recommend);
}
/// 后台预取漫剧与真人剧首屏,不切换频道,也不影响当前列表。
Future<void> prefetchChannels() async {
await Future.wait([
_prefetchChannel(HomeFeedChannel.anime),
_prefetchChannel(HomeFeedChannel.live),
]);
}
/// 同步切到目标频道;有缓存先渲染,无缓存时复用或等待在飞请求。
Future<void> selectChannel(HomeFeedChannel next) async {
if (next == _channel) return;
@@ -59,7 +67,9 @@ class HomeFeedController extends ChangeNotifier {
_notify();
final state = _state(next);
if (state.dramas.isNotEmpty) {
if (!state.loading) {
if (state.skipNextRefresh) {
state.skipNextRefresh = false;
} else if (!state.loading) {
unawaited(_refresh(next, keepData: true));
}
return;
@@ -67,6 +77,7 @@ class HomeFeedController extends ChangeNotifier {
if (state.loading) {
final inFlight = state.inFlight;
if (inFlight != null) await inFlight;
state.skipNextRefresh = false;
return;
}
await _refresh(next, keepData: false);
@@ -126,6 +137,13 @@ class HomeFeedController extends ChangeNotifier {
return operation;
}
Future<void> _prefetchChannel(HomeFeedChannel channel) async {
final state = _state(channel);
if (state.loaded || state.loading) return;
final success = await _refresh(channel, keepData: false);
if (success && !_disposed) state.skipNextRefresh = true;
}
Future<bool> _performRefresh(
HomeFeedChannel channel, {
required bool keepData,
@@ -200,4 +218,5 @@ class _ChannelFeedState {
String? lastError;
int requestSeq = 0;
Future<bool>? inFlight;
bool skipNextRefresh = false;
}