SMARTWATCH 学习手册有 C 基础 · 嵌入式从零开始
支线三 / Dart 与 Flutter App / 07

手机怎样设置手表,并记住用户输入

接收已经跑通,这次从一个体重输入框出发,把校验、组帧、发送和保存串起来,区分每一步完成的含义。

接续上一篇:自己的 App 怎样真正连上手表

1 · 输入框给出的是文字

用户输入体重时,TextField 提供字符串。字符串可能为空、带非数字字符或超出合理范围,不能直接当成可发送数字。先用 double.tryParse,再检查范围;年龄用 int.tryParse。失败时在输入附近说明原因,保留用户输入。

事件回调片段 · 范围是练习输入约束,产品需明确自己的参数规则

final weight = double.tryParse(weightText);
final age = int.tryParse(ageText);
if (weight == null || age == null ||
    weight <= 0 || weight > 300 || age <= 0 || age > 120) {
  return;
}
await ble.sendUserProfile(weight, age);

sendUserProfile 来自当前项目,负责把数值转换成协议载荷并发送。先沿它进入 packFrame,核对消息类型、字段倍率和字节顺序,再追踪发送到 FFE2;不用重新发明一套设置协议。

2 · 发送期间,为什么要暂时禁用按钮

快速连续点击会发起多次异步写入。先设置 sending=true,禁用提交按钮;等待结束后在 finally 中恢复。失败时给出结果,避免按钮一直停在发送中。等待返回后先检查 mounted,再修改页面状态。

服务内部的写入串行队列保证多条应用帧不会在分块之间任意交错。设备实际可写长度通常与已协商 MTU 有关;大帧拆块由服务处理。不能把所有界面按钮都直接调用特征 write,绕过现有的串行发送。

3 · 写入完成,说明了哪一步

一次蓝牙写入结束,表示这一层操作结束;手表是否已经解析并应用设置,还要看对应应用消息是否有确认和状态反馈。当前基础用户配置命令没有像原型恢复那样的完整提交事务,页面用语要说明发送结果,不宣称完成了没有反馈可证的业务。

会话控制调用 sendSessionStart、sendSessionEnd、sendSessionAbort;开始记录后还需要看手表反馈的有效样本数和版本变化。前端显示 Recording 并不保证每个采样窗口都被接纳,原型更新细节接到支线五 A。

4 · 关闭 App 后,输入值为什么丢了

需要 shared_preferences 包及其导入;在独立设置实验中使用

final prefs = await SharedPreferences.getInstance();
await prefs.setDouble("weightKg", weight);
final savedWeight = prefs.getDouble("weightKg");

State 字段只在当前运行中保存值。SharedPreferences 适合简单键值设置,保存与读取也具有异步步骤。先使用独立练习键名,加载完成后若页面仍在,再把值显示回去。用户个人档案、联系人和当前蓝牙连接是不同生命周期的数据。

当前项目联系人已经持久化;完整个人档案恢复流程尚未实现,且连接时还会发默认体重、年龄。这里的设置保存是新增练习,接回项目时必须同时梳理默认下发顺序,不能只增加一个本地存储调用就认为重连问题已经解决。

5 · 把双向流程写成一张记录表

操作观察位置
提交配置输入转换结果、发送消息原始字节、发送层结果。
主控处理串口帧解析与设置函数的实际调用。
重新连接本地已保存值、默认值和实际下发顺序。
结束训练会话设备原型版本和有效样本数,而不是仅看按钮文字。
动手观察

先用一组合法参数,核对手机和主控记录;再输入空值与错误文本,确认不会发送。最后重启练习 App,验证保存值恢复;真实项目仍按其现有默认行为记录。

资料与代码