70 lines
3.1 KiB
Markdown
70 lines
3.1 KiB
Markdown
# 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`;不改图标、启动图等无关资源。
|
||
- 完成后停住,等待验收。
|