3.1 KiB
3.1 KiB
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
- 新增
lib/core/navigation/app_route_observer.dart:
// Author: fruit.com.cn
import 'package:flutter/widgets.dart';
/// 全局页面路由观察者:供播放器在路由被覆盖时暂停。
final RouteObserver<PageRoute<dynamic>> appRouteObserver =
RouteObserver<PageRoute<dynamic>>();
-
lib/app.dart的MaterialApp增加navigatorObservers: [appRouteObserver]。 -
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()
-
PlayerLogic新增两个方法(放在onLifecycle附近):void onRouteCovered():session.setRouteVisible(false); cancelScrub(); unawaited(saveCurrentProgress());void onRouteRevealed():if (isMounted()) session.setRouteVisible(active);与openDetail()/openSeriesAt()已有的显式设置重复时同值,不应产生抖动。
-
覆盖场景验收:
- 首页 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;不改图标、启动图等无关资源。 - 完成后停住,等待验收。