fix(player): 修复切集返回推荐页黑屏

This commit is contained in:
Zhou Weidong committed 2026-10-26 16:20:31 +08:00
1 parent 9d2d3b97a1
commit 440188f261
5 files changed
+297 -37

No files matched your search

@@ -4,6 +4,9 @@ import '../models/drama.dart';
/// A player session has one navigation meaning: browse dramas or browse episodes.
class PlaybackQueue {
PlaybackQueue.fromEntries(List<PlaybackEntry> entries)
: entries = List.unmodifiable(entries);
PlaybackQueue.home(List<Drama> dramas)
: entries = List.unmodifiable(
dramas
@@ -137,6 +137,47 @@ class PlaybackSession extends ChangeNotifier {
if (_visible && !_overlayOpen) _warmNeighbors(this);
}
/// 在剧维度和集维度之间切换队列,但保留当前 active controller 与播放状态。
void remapQueuePreservingActive(
List<Episode> nextEpisodes, {
required int currentIndex,
int? preloadIndex,
int? previousIndex,
bool notify = true,
}) {
if (_closed ||
currentIndex < 0 ||
currentIndex >= nextEpisodes.length ||
_active == null) {
return;
}
_generation++;
episodes
..clear()
..addAll(nextEpisodes);
_active!.index = currentIndex;
_currentIndex = currentIndex;
_selected = true;
_loading = false;
_error = null;
_rememberNeighbors(preloadIndex, previousIndex);
final staleNext = _next;
final stalePrevious = _previous;
final staleHandoff = _handoff;
_next = null;
_previous = null;
_handoff = null;
if (notify) _notify();
unawaited(
_enqueue(() async {
await _retire(staleNext);
await _retire(stalePrevious);
await _retire(staleHandoff);
}),
);
if (_visible && !_overlayOpen) _warmNeighbors(this);
}
void _rememberNeighbors(int? preloadIndex, int? previousIndex) {
_nextIndex = preloadIndex;
_previousIndex = previousIndex;