Skip to content

recording-sync-state-machine ​

1. 实验目标与工程要点 ​

这个 Flutter host 样板把录音转写案例里的页面层状态收敛成一条可观察状态机:

  • recording:录音进行中
  • waitingUpload:录音结束,等待交接上传
  • uploading:客户端 / 宿主正在上传
  • transcribing:服务端异步转写中
  • synced:结果已回流
  • failed:当前尝试失败,但还可重试或补拉

它验证的重点是:Flutter 最适合统一业务状态与用户反馈,而不是直接承担后台长链路执行。


2. 深入原理与生活浅显比喻 ​

2.1 生活浅显比喻 ​

把它想成物流看板:

  • 录音页像仓库前台,只负责展示“已收件、待发车、运输中、已签收”
  • 真正开车送货的是宿主上传任务和服务端转写任务
  • 前台看板可以很清楚,但不能代替车队与仓库系统本身

2.2 底层原理分析 ​

这个页面要解决两个最容易混掉的边界:

  1. 页面状态 ≠ 后台授权:Flutter 可以知道当前是 uploading,但是否真能在后台继续上传,仍由宿主平台决定。
  2. 推送到达 ≠ 会话已收敛:推送只是加速器,最终还是要以前台补拉或会话刷新把状态收口到 synced。

2.3 方案对比矩阵 ​

方案通俗比喻底层原理保证特性吞吐性能运行开销适用场景
页面只放 loading大厅只挂“处理中”灯牌单布尔值状态最弱高低Demo
显式会话状态机物流每一站都单独亮灯阶段状态枚举 + 日志可观察、易排障中中录音转写、上传回流
页面直接做后台执行前台自己去开运输车业务状态与后台执行耦合脆弱中高不推荐

3. Android / 移动端实战场景与误配事故 ​

3.1 实战场景 ​

  • 会议录音页
  • 即时语音笔记页
  • 上传后等待 AI 结构化结果回流的详情页

3.2 常见误配与事故注意事项 ​

  • 只用一个 isLoading,导致用户根本不知道卡在上传还是转写
  • 推送丢失后一直停在 transcribing,没有前台补拉入口
  • 页面销毁后把服务端任务也当成“结束了”

3.3 排障思路 ​

先问:

  1. 失败发生在 uploading 还是 transcribing?
  2. 推送丢失时有没有前台补拉入口?
  3. 重新进会话页时状态能不能根据服务端结果恢复?

4. 实验源码与运行验证 ​

关键源码 ​

关键参数 / 开关 ​

  • 上传时有网:关闭后第一次上传会进入 failed
  • 转写完成时推送到达:关闭后需要手动点“前台补拉”才能收敛为 synced

运行方式 ​

bash
cd labs/flutter/host
flutter pub get
flutter run

启动后在首页进入 录音回流状态机。

预期控制台运行输出 ​

text
[recording] 前台录音会话已开始
[waitingUpload] 录音结束,等待宿主把文件交给上传层
[uploading] 第 1 次尝试上传音频分片
[transcribing] 服务端已接管任务,客户端只保留会话状态
[synced] 前台补拉成功,录音纪要已回流到当前会话

5. 对应知识库文档 ​

站点构建时间:2026/8/24 23:43:17