fix(player): 解锁状态登录期内共享,重进播放页不再丢解锁
解锁记录原本是播放页实例的私有集合,退出再进入会先闪一次锁定态,还会 被 selectLocked 提前释放播放器。改为进程内共享的 UnlockedEpisodeRegistry, 由全局注入并在登录态变化时清空;播放器三处渲染分支统一走同一判定, 会话锁态只约束当前页,避免相邻预加载页被误判为锁定。
This commit is contained in:
1 parent
a4d08e7c1e
commit
57f84c45bd
6 files changed
+103
-18
No files matched your search
@@ -0,0 +1,22 @@
|
||||
// Author: fruit.com.cn
|
||||
|
||||
/// 本次登录期内已确认可播的收费集。
|
||||
///
|
||||
/// 解锁本身是服务端行为(`POST /app/episodes/{id}/unlock` 成功即生效),
|
||||
/// 客户端只需要记住「这一集不用再挡」。若不记住,退出播放页再进来会先闪
|
||||
/// 一次锁定态,且会被 [PlaybackSession.selectLocked] 提前释放播放器。
|
||||
///
|
||||
/// 生命周期跟随账号:登录态变化时由 `app.dart` 调用 [clear],避免换账号后
|
||||
/// 沿用上一个人的解锁结论。
|
||||
class UnlockedEpisodeRegistry {
|
||||
final Set<String> _episodeIds = <String>{};
|
||||
|
||||
bool contains(String episodeId) => _episodeIds.contains(episodeId);
|
||||
|
||||
void markUnlocked(String episodeId) {
|
||||
if (episodeId.isEmpty) return;
|
||||
_episodeIds.add(episodeId);
|
||||
}
|
||||
|
||||
void clear() => _episodeIds.clear();
|
||||
}
|
||||
Reference in new issue
Block a user