# INBOX ## [已处理] 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()`。 ### 目标 - 冷启动尽快开始首页数据请求:第一帧立即绘制(深底 + 主题色转圈),探测一完成立刻拉首页。 - 探测并行化:三个候选同时探测,总耗时上限约 2s;仍按 `127.0.0.1 > 192.168.31.187 > 公网` 的优先级选第一个可用地址。 - 观感:原生开屏 → 应用内同款深底转圈(数据在拉)→ 首页。 ### 实现 1. `lib/core/config/app_config.dart` - 新增 `static Future ready = Future.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()`。 ### 验收 - 冷启动不再有「原生开屏停住等探测」的空窗:第一帧立即出现深底转圈。 - 探测总等待从最长 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 留痕。 ### 约束 - 全程中文;禁止 `git add -A`;不改原生开屏资源、不改 UI 视觉;完成后停住等待验收。