Files
FruitServer/docs/plans/INBOX.md
T

2.8 KiB
Raw Blame History

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<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()。

验收

  • 冷启动不再有「原生开屏停住等探测」的空窗:第一帧立即出现深底转圈。
  • 探测总等待从最长 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 视觉;完成后停住等待验收。