# 播放位置连续性 ## 目标 - 首页进入详情、详情返回首页、详情再进播放器时保持同一集同一秒。 - 新增进程内最近播放位置缓存,优先于服务端旧记录。 - 跨剧、跨集不串位;锁定/票据失败不因缓存强行起播;进程重启仍回服务端。 ## 实施步骤 1. 新增 `PlaybackPositionCache`,按 episodeId 保存 dramaId/position/duration/updatedAt。 2. App Provider 注入单一缓存实例,PlayerPage 与详情页共享。 3. PlayerLogic 进度监听、saveCurrentProgress 写入缓存;loadResumePoint 优先命中缓存。 4. preparePlayer 对每个待准备集按 dramaId 校验缓存,并继续使用现有位置钳位。 5. 详情页续看状态优先使用该剧最新缓存,未命中再请求服务端。 6. 补缓存、缓存命中不请求服务端、跨剧隔离、服务端回落和详情返回位置测试。 7. 执行 `dart analyze lib test` 与 `flutter test --no-pub`,回填 PROGRESS 后提交合并。 ## 风险 / 待确认 - 缓存仅保存在进程内,App 重启后自动回落到服务端观看记录。 - 片尾附近继续复用现有 `clampResumePosition` 完成保护。 ## 执行结果 - 新增进程内按集缓存并通过 Provider 全局共享,详情页与播放器共用。 - 进度监听、`saveCurrentProgress` 和进入详情前会写入缓存。 - `loadResumePoint` 优先缓存,未命中或跨剧时才请求服务端。 - 详情页继续观看与 CTA 优先进缓存集;返回首页保持原播放器与位置。 - 已覆盖缓存读写/过期、跨剧隔离、缓存命中去网络、服务端回落和详情往返。 - `dart analyze lib test` 零告警,`flutter test --no-pub` 589 项全过。 - 未启停服务,未操作真机。