# 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> appRouteObserver = RouteObserver>(); ``` 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`;不改图标、启动图等无关资源。 - 完成后停住,等待验收。