Files
FruitServer/docs/plans/INBOX.md
T

70 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# INBOX
## [已处理] K63-A 首页 feed 跳转登录页时暂停播放
### 现象
安卓端从首页 feed 点右侧「收藏 / 评论 / 喜欢」(未登录)→ 引导进入登录页 `AuthPage`,
播放器没有暂停,画面和声音继续播;返回首页后也没有恢复/续播的判定。
### 根因
暂停由 `PlaybackSession._mayPlay = _visible && !_overlayOpen && _userWantsPlay` 控制,
其中 `_visible = !_closed && _appResumed && _routeVisible`。
`_routeVisible` 只有这几处显式设置:`openDetail()`、`openSeriesAt()`、`showEpisodes()`、
`PlayerLogic.dispose()`、`onPageUpdated()`。登录页是普通 `Navigator.push`(
`lib/core/widgets/auth_gate.dart` → `openAuthPage`),没有任何一处通知播放器,
于是 `_routeVisible` 一直为 true,继续播放。
### 方案:引入全局 RouteObserver
1. 新增 `lib/core/navigation/app_route_observer.dart`:
```dart
// Author: fruit.com.cn
import 'package:flutter/widgets.dart';
/// 全局页面路由观察者:供播放器在路由被覆盖时暂停。
final RouteObserver<PageRoute<dynamic>> appRouteObserver =
RouteObserver<PageRoute<dynamic>>();
```
2. `lib/app.dart` 的 `MaterialApp` 增加 `navigatorObservers: [appRouteObserver]`。
3. `lib/pages/player/player_view.dart` 的 `_PlayerPageState` 混入 `RouteAware`:
- `didChangeDependencies()`:`final route = ModalRoute.of(context);`
若 `route is PageRoute` 且尚未订阅,则 `appRouteObserver.subscribe(this, route)`(防重复订阅)
- `dispose()`:`appRouteObserver.unsubscribe(this)`
- `didPushNext()`:调 `logic.onRouteCovered()`
- `didPopNext()`:调 `logic.onRouteRevealed()`
4. `PlayerLogic` 新增两个方法(放在 `onLifecycle` 附近):
- `void onRouteCovered()`:`session.setRouteVisible(false); cancelScrub(); unawaited(saveCurrentProgress());`
- `void onRouteRevealed()`:`if (isMounted()) session.setRouteVisible(active);`
与 `openDetail()` / `openSeriesAt()` 已有的显式设置重复时同值,不应产生抖动。
5. 覆盖场景验收:
- 首页 feed 未登录点收藏 / 评论 / 喜欢 → 进登录页:暂停;返回:恢复播放
- 首页 feed → 详情页(仍走 `openDetail` 的 overlay 逻辑):暂停 / 返回恢复
- 全屏播放页 → 登录页:暂停 / 返回恢复
- 首页 feed 打开选集弹层(PopupRoute):行为不变,仍由 `setOverlayOpen` 控制
### 测试要求
- `test/player/` 下补充用例:push 一个 `PageRoute` 后 `session` 不可播放、pop 后恢复;
首页 feed 进 `AuthPage` 暂停(可用 `RouteObserver` + 测试路由验证)。
- 门禁:`dart analyze lib test` 零告警、`flutter test` 全过、`flutter build apk --debug` 成功。
### Git
- 从 `develop` 拉 `fix/player-pause-on-route`。
- 提交:`fix(player): 路由覆盖时暂停播放`,作者 `Zhou Weidong <502333560@qq.com>`。
- `--no-ff` 合回 `develop` 并 push;`FruitServer/docs/plans/PROGRESS.md` 追加 K63-A 留痕。
### 约束
- 全程中文;禁止 `git add -A`;不改图标、启动图等无关资源。
- 完成后停住,等待验收。