docs(plans): 留痕 K66 启动页停留首页就绪

This commit is contained in:
Zhou Weidong committed 2026-10-20 19:58:09 +08:00
1 parent 5e509b20ed
commit c5def287b8
2 files changed
+77 -34

No files matched your search

+46 -34
View File
@@ -1,55 +1,67 @@
# INBOX
## [已处理] K65-A 冷启动提前拉取首页数据
## [已处理] K66-A 启动页停留到首页就绪再进首页
### 背景
K65-A 已把首页预取提前到启动阶段。产品要求再简化观感:
> 「等首页加载完就进入首页就行了」
即:别再出现「深底 + 转圈」这种中间页,启动期间保持与原生开屏一致的品牌画面,
目录数据就绪后直接进首页。
### 现状
- `lib/main.dart` 在 `runApp` 之前 `await AppConfig.probeAndApplyBaseUrl()`,三个候选地址
(`127.0.0.1` / `192.168.31.187` / 公网)**串行**探测,每个 2s 超时,最坏 6s。
这段时间原生开屏一直停留,首页请求根本还没开始。
- `runApp` 之后,`app.dart` 的 Provider 才创建 `CatalogController` 并 `..load()`。
`lib/pages/home/home_view.dart` 的 `_buildHome`:
- `catalog.loading` 为 true 时返回 `AnnotatedRegion(light) + Scaffold(splashInk, 居中主题色转圈)`
- 数据就绪后才渲染 `_HomeTabs`
### 目标
- 冷启动尽快开始首页数据请求:第一帧立即绘制(深底 + 主题色转圈),探测一完成立刻拉首页。
- 探测并行化:三个候选同时探测,总耗时上限约 2s;仍按
`127.0.0.1 > 192.168.31.187 > 公网` 的优先级选第一个可用地址。
- 观感:原生开屏 → 应用内同款深底转圈(数据在拉)→ 首页。
- `catalog.loading` 且**首次启动尚未 settled** 时,显示与原生开屏一致的品牌画面:
深底 `AppColors.splashInk` + 居中的开屏图,不再显示转圈。
- 目录数据就绪后同帧切到首页。
- 非首次(`settled == true`,例如失败重试)仍保留原来的转圈 loading,避免重复播品牌画面。
### 实现
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()`。
1. `pubspec.yaml`:`flutter.assets` 增加
- `assets/icon/splash_logo.png`
- `assets/icon/splash_logo_android12.png`
2. `lib/pages/home/home_view.dart`
- 新增私有 `_startupSplash()`:
- `AnnotatedRegion<SystemUiOverlayStyle>(value: SystemUiOverlayStyle.light)`
- `ColoredBox(color: AppColors.splashInk)`
- 居中 `Image.asset(..., key: Key('startup-splash'))`
- Android 用 `splash_logo_android12.png`、其它平台用 `splash_logo.png`
(与各自原生开屏的取图一致,避免切换时跳变)
- 尺寸:Android 288 逻辑像素见方,其它平台 384
- `_buildHome`:
```dart
if (catalog.loading) {
return catalog.settled ? _retryLoading() : _startupSplash();
}
```
`_retryLoading()` 即现有的深底 + 主题色转圈。
3. 测试(`test/home/` 下)
- `settled == false` 且 loading:出现 `startup-splash`,不出现 `CircularProgressIndicator`
- `settled == true` 且 loading:出现转圈,不出现 `startup-splash`
- 数据就绪:出现首页 feed,`startup-splash` 消失
4. 真机自查建议:冷启动录屏,确认原生开屏 → 品牌画面(无转圈)→ 首页,无闪白。
### 验收
- 冷启动不再有「原生开屏停住等探测」的空窗:第一帧立即出现深底转圈。
- 探测总等待从最长 6s 降到约 2s。
- 冷启动不再出现单独的转圈页。
- 门禁:`dart analyze lib test` 零告警、`flutter test` 全过、`flutter build apk --debug` 成功。
### Git
- 从 `develop` 拉 `feat/startup-prefetch`。
- 提交:`perf(home): 冷启动提前拉取首页数据`,作者 `Zhou Weidong <502333560@qq.com>`。
- `--no-ff` 合回 `develop` 并 push;`FruitServer/docs/plans/PROGRESS.md` 追加 K65-A 留痕。
- 从 `develop` 拉 `feat/startup-splash-hold`。
- 提交:`feat(home): 启动页停留至首页就绪`,作者 `Zhou Weidong <502333560@qq.com>`。
- `--no-ff` 合回 `develop` 并 push;`FruitServer/docs/plans/PROGRESS.md` 追加 K66-A 留痕。
### 约束
- 全程中文;禁止 `git add -A`;不改原生开屏资源、不改 UI 视觉;完成后停住等待验收。
- 全程中文;禁止 `git add -A`;不改原生开屏资源与其它页面;完成后停住等待验收。
+31
View File
@@ -22362,3 +22362,34 @@ Running Gradle task 'assembleDebug'...
```
解读:静态检查零告警,475 条测试全部通过,debug APK 构建成功。真机验收由用户执行。
## 2026-10-20 ReelShort:K66-A 启动页停留到首页就绪再进首页
- 前置状态:K65-A 已完成并合并,develop 合并提交 `c76b388`。
- 分支:`feat/startup-splash-hold`
- 功能提交:`7871b0c feat(home): 启动页停留至首页就绪`
- develop 合并提交:`d2174c5 merge: 合并 K66-A 启动页停留至首页就绪`,已推送。
- `pubspec.yaml` 将 Android 12 与通用品牌开屏图加入 Flutter 资产,应用内启动阶段可直接复用原生开屏图。
- 首次 `catalog.loading && !settled` 时显示深底品牌启动图,不再显示单独转圈;Android 使用 `splash_logo_android12.png` 288 逻辑像素,其它平台使用 `splash_logo.png` 384 逻辑像素。
- `catalog.settled` 后的失败重试仍显示原深底主题色转圈;目录数据完成后启动图同帧移除并进入首页 feed。
- 门禁产生的 `pubspec.lock` 依赖漂移已还原,未纳入本批提交。
测试:新增首次启动品牌图 Android/iOS 路径与尺寸、settled 重试转圈、数据完成后启动图消失并出现首页 feed 三条用例。
门禁原始输出:
```text
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:57 +478: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'...
7.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
解读:静态检查零告警,478 条测试全部通过,debug APK 构建成功。真机验收由用户执行。