docs(plans): 留痕 K64 原生品牌启动图

This commit is contained in:
Zhou Weidong committed 2026-10-20 19:42:45 +08:00
1 parent 0f477c6b15
commit f6ce79c65a
2 files changed
+72 -54

No files matched your search

+44 -54
View File
@@ -1,69 +1,59 @@
# INBOX
## [已处理] K63-A 首页 feed 跳转登录页时暂停播放
## [已处理] K64-A 原生开屏改为品牌启动图
### 现象
### 背景
安卓端从首页 feed 点右侧「收藏 / 评论 / 喜欢」(未登录)→ 引导进入登录页 `AuthPage`,
播放器没有暂停,画面和声音继续播;返回首页后也没有恢复/续播的判定。
自定义 Flutter 动画开屏页观感不佳(元素多、文字不够亮)。按产品要求改为**只保留原生启动屏**:
### 根因
- 深暖底 `#1F1B16` 上一枚果篮图标 + 明亮奶油白 `FruitShorts` + 橙色「水果短剧」
- 原生启动屏由 `flutter_native_splash` 生成,Android 12+ 用 `android12splash`,旧版本用 `splash`,
iOS 用 `LaunchImage` / `LaunchBackground`
- 删除自定义开屏页,首页首帧加载态改为同款深底 + 主题色转圈,避免深→浅闪白
暂停由 `PlaybackSession._mayPlay = _visible && !_overlayOpen && _userWantsPlay` 控制,
其中 `_visible = !_closed && _appResumed && _routeVisible`。
已完成本机实现与真机验证(Android 16 录屏逐帧确认:开屏 → 加载 → feed 全程深色,无白闪)。
门禁已由 Trae 复跑:`dart analyze lib test` 零告警、`flutter test` 473 条全过、`flutter build apk --debug` 成功。
`_routeVisible` 只有这几处显式设置:`openDetail()`、`openSeriesAt()`、`showEpisodes()`、
`PlayerLogic.dispose()`、`onPageUpdated()`。登录页是普通 `Navigator.push`(
`lib/core/widgets/auth_gate.dart` → `openAuthPage`),没有任何一处通知播放器,
于是 `_routeVisible` 一直为 true,继续播放。
### 工作区改动(ReelShort,develop,未提交)
### 方案:引入全局 RouteObserver
新增:
- `assets/icon/splash_logo.png`
- `assets/icon/splash_logo_android12.png`
- `android/app/src/main/res/drawable/background.png`
- `android/app/src/main/res/drawable-v21/background.png`
- `android/app/src/main/res/drawable-{mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi}/splash.png`
- `android/app/src/main/res/drawable-{mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi}/android12splash.png`
- `android/app/src/main/res/drawable-night-{mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi}/android12splash.png`
- `ios/Runner/Assets.xcassets/LaunchImage.imageset/`
- `ios/Runner/Assets.xcassets/LaunchBackground.imageset/`
1. 新增 `lib/core/navigation/app_route_observer.dart`:
修改:
- `pubspec.yaml`(移除 `splash_mark.png` 资产声明,`flutter_native_splash` 配置改为深底 + 新图)
- `lib/core/theme/app_colors.dart`(新增 `splashInk = #1F1B16`)
- `lib/pages/home/home_view.dart`(删除 `SplashPage` 分支;加载态改深底 + 浅色状态栏)
- `android/app/src/main/res/drawable/launch_background.xml`
- `android/app/src/main/res/drawable-v21/launch_background.xml`
- `android/app/src/main/res/values/colors.xml`
- `android/app/src/main/res/values-v31/styles.xml`
- `android/app/src/main/res/values-night-v31/styles.xml`
- `ios/Runner/Base.lproj/LaunchScreen.storyboard`
```dart
// Author: fruit.com.cn
删除:
- `assets/icon/splash_mark.png`
- `lib/pages/splash/splash_page.dart`
- `test/splash/splash_gate_test.dart`
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 留痕。
1. 从 `develop` 拉分支 `feat/native-splash-logo`(工作区改动直接带入)。
2. 只提交上述文件;**禁止 `git add -A`**。
3. **不要提交** `pubspec.lock`、`android/app/src/main/AndroidManifest.xml`、`ios/Runner/Info.plist`
(这三处已还原为 develop 原样,禁止再改动)。
4. 提交:`feat(splash): 原生开屏改为品牌启动图`,作者 `Zhou Weidong <502333560@qq.com>`。
5. 门禁:`dart analyze lib test`、`flutter test`、`flutter build apk --debug` 全过。
6. `--no-ff` 合并回 `develop` 并 push。
7. `FruitServer/docs/plans/PROGRESS.md` 追加 K64-A 留痕(分支、commit、门禁原始输出)。
### 约束
- 全程中文;禁止 `git add -A`;不改图标、启动图等无关资源。
- 完成后停住,等待验收。
- 全程中文;不改其它功能代码;完成后停住,等待验收。
+28
View File
@@ -22303,3 +22303,31 @@ Running Gradle task 'assembleDebug'...
```
解读:静态检查零告警,444 条测试全部通过,debug APK 构建成功。工作区原有 `pubspec.lock` 变更未纳入本批提交。真机验收由用户执行。
## 2026-10-20 ReelShort:K64-A 原生开屏改为品牌启动图
- 前置状态:K63-A 已完成并合并,develop 合并提交 `210ccc9`。
- 分支:`feat/native-splash-logo`
- 功能提交:`8f60046 feat(splash): 原生开屏改为品牌启动图`
- develop 合并提交:`1199db7 merge: 合并 K64-A 原生品牌启动图`,已推送。
- 使用 `flutter_native_splash` 生成 Android 旧版 `splash`、Android 12+ `android12splash` 日/夜资源及 iOS `LaunchImage` / `LaunchBackground`,原生背景统一为深暖底 `#1F1B16`。
- 删除 Flutter 自定义 `SplashPage` 与对应测试,首页首帧加载态改为同色深底、浅色状态栏和主题色转圈,避免原生开屏到首页之间闪白。
- 本次精确提交 37 个任务文件,未提交 `pubspec.lock`、`AndroidManifest.xml`、`Info.plist`;门禁产生的 lock 漂移已还原。
门禁原始输出:
```text
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
01:01 +473: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
2,498ms
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
解读:静态检查零告警,473 条测试全部通过,debug APK 构建成功。真机验收由用户执行。