fix(player): 解锁状态登录期内共享,重进播放页不再丢解锁
解锁记录原本是播放页实例的私有集合,退出再进入会先闪一次锁定态,还会 被 selectLocked 提前释放播放器。改为进程内共享的 UnlockedEpisodeRegistry, 由全局注入并在登录态变化时清空;播放器三处渲染分支统一走同一判定, 会话锁态只约束当前页,避免相邻预加载页被误判为锁定。
This commit is contained in:
1 parent
a4d08e7c1e
commit
57f84c45bd
6 files changed
+103
-18
No files matched your search
@@ -20,6 +20,7 @@ import '../../core/data/services/playback_position_cache.dart';
|
||||
import '../../core/data/services/playback_session.dart';
|
||||
import '../../core/data/services/sprite_thumbnail_axis.dart';
|
||||
import '../../core/data/services/playback_thumbnail_service.dart';
|
||||
import '../../core/data/services/unlocked_episode_registry.dart';
|
||||
import '../../core/data/services/video_player_port.dart';
|
||||
import '../../core/data/services/wallet_controller.dart';
|
||||
import '../../core/formatting/error_text.dart';
|
||||
@@ -167,6 +168,7 @@ class _PlayerPageState extends State<PlayerPage>
|
||||
history: context.read<WatchHistoryRepository>(),
|
||||
playback: context.read<PlaybackRepository>(),
|
||||
positionCache: context.read<PlaybackPositionCache>(),
|
||||
unlockedEpisodes: _readUnlockedEpisodes(context),
|
||||
wallet: widget.wallet,
|
||||
downloads: widget.downloads,
|
||||
isSignedIn: () => context.read<AuthController>().isSignedIn,
|
||||
@@ -349,6 +351,16 @@ class _PlayerPageState extends State<PlayerPage>
|
||||
setState(() => _playbackSpeed = value);
|
||||
}
|
||||
|
||||
/// 全局解锁登记表(登录期内共享);直接构造播放页的测试没有 Provider,
|
||||
/// 返回 null 让 PlayerLogic 退化成页面自用的一份。
|
||||
UnlockedEpisodeRegistry? _readUnlockedEpisodes(BuildContext context) {
|
||||
try {
|
||||
return context.read<UnlockedEpisodeRegistry>();
|
||||
} on ProviderNotFoundException {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
void _hideChrome() {
|
||||
if (!_chromeVisible) return;
|
||||
setState(() => _chromeVisible = false);
|
||||
@@ -956,10 +968,7 @@ class _PlayerPageState extends State<PlayerPage>
|
||||
}
|
||||
final episode = _resolvedEpisode(index);
|
||||
final selected = index == currentIndex;
|
||||
final locked =
|
||||
logic.isEpisodeLocked(episode) ||
|
||||
(selected && logic.session.isLocked) ||
|
||||
logic.blockedEpisodeId == episode.id;
|
||||
final locked = logic.isEpisodeBlockedFor(episode, index);
|
||||
final port = locked
|
||||
? null
|
||||
: (selected ? logic.session.active : null) ??
|
||||
@@ -1042,10 +1051,7 @@ class _PlayerPageState extends State<PlayerPage>
|
||||
final drama = entry.drama;
|
||||
final episode = _resolvedEpisode(index);
|
||||
final selected = index == logic.session.currentIndex;
|
||||
final locked =
|
||||
logic.isEpisodeLocked(episode) ||
|
||||
logic.session.isLocked ||
|
||||
logic.blockedEpisodeId == episode.id;
|
||||
final locked = logic.isEpisodeBlockedFor(episode, index);
|
||||
// Selection changes before the prepared slot is promoted. Use its controller
|
||||
// throughout the handoff instead of briefly falling back to a placeholder.
|
||||
final port = locked
|
||||
@@ -1294,10 +1300,7 @@ class _PlayerPageState extends State<PlayerPage>
|
||||
final drama = entry.drama;
|
||||
final episode = _resolvedEpisode(index);
|
||||
final selected = index == logic.session.currentIndex;
|
||||
final locked =
|
||||
logic.isEpisodeLocked(episode) ||
|
||||
logic.session.isLocked ||
|
||||
logic.blockedEpisodeId == episode.id;
|
||||
final locked = logic.isEpisodeBlockedFor(episode, index);
|
||||
final port = locked
|
||||
? null
|
||||
: (selected ? logic.session.active : null) ??
|
||||
|
||||
Reference in new issue
Block a user