docs(plans): 留痕 K65 冷启动首页预取
This commit is contained in:
1 parent
f6ce79c65a
commit
5e509b20ed
2 files changed
+71
-44
No files matched your search
+40
-44
@@ -1,59 +1,55 @@
|
||||
# INBOX
|
||||
|
||||
## [已处理] K64-A 原生开屏改为品牌启动图
|
||||
## [已处理] K65-A 冷启动提前拉取首页数据
|
||||
|
||||
### 背景
|
||||
### 现状
|
||||
|
||||
自定义 Flutter 动画开屏页观感不佳(元素多、文字不够亮)。按产品要求改为**只保留原生启动屏**:
|
||||
- `lib/main.dart` 在 `runApp` 之前 `await AppConfig.probeAndApplyBaseUrl()`,三个候选地址
|
||||
(`127.0.0.1` / `192.168.31.187` / 公网)**串行**探测,每个 2s 超时,最坏 6s。
|
||||
这段时间原生开屏一直停留,首页请求根本还没开始。
|
||||
- `runApp` 之后,`app.dart` 的 Provider 才创建 `CatalogController` 并 `..load()`。
|
||||
|
||||
- 深暖底 `#1F1B16` 上一枚果篮图标 + 明亮奶油白 `FruitShorts` + 橙色「水果短剧」
|
||||
- 原生启动屏由 `flutter_native_splash` 生成,Android 12+ 用 `android12splash`,旧版本用 `splash`,
|
||||
iOS 用 `LaunchImage` / `LaunchBackground`
|
||||
- 删除自定义开屏页,首页首帧加载态改为同款深底 + 主题色转圈,避免深→浅闪白
|
||||
### 目标
|
||||
|
||||
已完成本机实现与真机验证(Android 16 录屏逐帧确认:开屏 → 加载 → feed 全程深色,无白闪)。
|
||||
门禁已由 Trae 复跑:`dart analyze lib test` 零告警、`flutter test` 473 条全过、`flutter build apk --debug` 成功。
|
||||
- 冷启动尽快开始首页数据请求:第一帧立即绘制(深底 + 主题色转圈),探测一完成立刻拉首页。
|
||||
- 探测并行化:三个候选同时探测,总耗时上限约 2s;仍按
|
||||
`127.0.0.1 > 192.168.31.187 > 公网` 的优先级选第一个可用地址。
|
||||
- 观感:原生开屏 → 应用内同款深底转圈(数据在拉)→ 首页。
|
||||
|
||||
### 工作区改动(ReelShort,develop,未提交)
|
||||
### 实现
|
||||
|
||||
新增:
|
||||
- `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/config/app_config.dart`
|
||||
- 新增 `static Future<void> ready = Future<void>.value();`,作为「启动探测完成」的信号;
|
||||
默认已完成,保证现有测试无感。
|
||||
- `probeAndApplyBaseUrl` 改为**并行**发起所有候选探测(`Future.wait`),
|
||||
全部返回后按原优先级取第一个成功地址并 `applyRuntimeBaseUrl`;
|
||||
全失败时仍走 `fallbackBaseUrl ?? defaultBaseUrl`。
|
||||
- 保留 `probe` 注入参数与现有「运行中重试」语义。
|
||||
2. `lib/main.dart`
|
||||
- 不再 `await` 探测:`AppConfig.ready = AppConfig.probeAndApplyBaseUrl();` 后立即 `runApp`。
|
||||
- `ServerEndpoint.load()`、竖屏锁定仍保持 `await`。
|
||||
3. `lib/core/data/services/catalog_controller.dart`
|
||||
- `load()` 里先 `loading = true; error = null; debugError = null; notifyListeners();`
|
||||
然后 `await AppConfig.ready;` 再发起请求,保证请求用的是探测后的地址,
|
||||
且等待期间首页显示转圈而不是「暂无短剧」。
|
||||
4. 测试
|
||||
- `probeAndApplyBaseUrl`:三个候选并行、优先级选择、全失败回落。
|
||||
- `CatalogController.load()`:`AppConfig.ready` 未完成时 `loading == true` 且未发请求,
|
||||
完成后按最终地址发请求;测试结束复位 `AppConfig.ready` 与运行时地址。
|
||||
- 其余测试如受 `AppConfig.ready` 影响,需在 `setUp` 复位为 `Future.value()`。
|
||||
|
||||
修改:
|
||||
- `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`
|
||||
### 验收
|
||||
|
||||
删除:
|
||||
- `assets/icon/splash_mark.png`
|
||||
- `lib/pages/splash/splash_page.dart`
|
||||
- `test/splash/splash_gate_test.dart`
|
||||
- 冷启动不再有「原生开屏停住等探测」的空窗:第一帧立即出现深底转圈。
|
||||
- 探测总等待从最长 6s 降到约 2s。
|
||||
- 门禁:`dart analyze lib test` 零告警、`flutter test` 全过、`flutter build apk --debug` 成功。
|
||||
|
||||
### 任务
|
||||
### Git
|
||||
|
||||
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、门禁原始输出)。
|
||||
- 从 `develop` 拉 `feat/startup-prefetch`。
|
||||
- 提交:`perf(home): 冷启动提前拉取首页数据`,作者 `Zhou Weidong <502333560@qq.com>`。
|
||||
- `--no-ff` 合回 `develop` 并 push;`FruitServer/docs/plans/PROGRESS.md` 追加 K65-A 留痕。
|
||||
|
||||
### 约束
|
||||
|
||||
- 全程中文;不改其它功能代码;完成后停住,等待验收。
|
||||
- 全程中文;禁止 `git add -A`;不改原生开屏资源、不改 UI 视觉;完成后停住等待验收。
|
||||
@@ -22331,3 +22331,34 @@ Running Gradle task 'assembleDebug'...
|
||||
```
|
||||
|
||||
解读:静态检查零告警,473 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
|
||||
|
||||
## 2026-10-20 ReelShort:K65-A 冷启动提前拉取首页数据
|
||||
|
||||
- 前置状态:K64-A 已完成并合并,develop 合并提交 `1199db7`。
|
||||
- 分支:`feat/startup-prefetch`
|
||||
- 功能提交:`9b31d83 perf(home): 冷启动提前拉取首页数据`
|
||||
- develop 合并提交:`c76b388 merge: 合并 K65-A 冷启动首页预取`,已推送。
|
||||
- `main()` 不再等待地址探测,先启动 `AppConfig.ready` 并立即 `runApp`;竖屏设置与本地服务地址读取仍保持等待。
|
||||
- 三个地址候选改为 `Future.wait` 并行探测,全部返回后仍按本机、开发机、公网的原有优先级选择首个成功地址;全部失败继续使用指定 fallback 或平台默认地址。
|
||||
- `CatalogController.load()` 首帧先进入 loading,再等待 ready 后请求首页;默认 ready 按需生成已完成 Future,避免 fake-async 跨用例复用造成挂起。
|
||||
- `ApiClient` 未显式指定 baseUrl 时,在每次请求前同步最新运行时地址;显式 baseUrl 保持固定,确保启动探测完成后首页请求真正发往选中地址。
|
||||
|
||||
测试:新增并行探测门闩、优先级选择、ready 完成前零请求、最终地址生效及客户端先构造后探测动态地址用例;全量既有用例保持通过。
|
||||
|
||||
门禁原始输出:
|
||||
|
||||
```text
|
||||
$ dart analyze lib test
|
||||
Analyzing lib, test...
|
||||
No issues found!
|
||||
|
||||
$ flutter test
|
||||
00:48 +475: All tests passed!
|
||||
|
||||
$ flutter build apk --debug
|
||||
Running Gradle task 'assembleDebug'...
|
||||
7.5s
|
||||
✓ Built build/app/outputs/flutter-apk/app-debug.apk
|
||||
```
|
||||
|
||||
解读:静态检查零告警,475 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
|
||||
Reference in new issue
Block a user