1. 项目背景与核心价值
作为一名长期关注移动健康领域的开发者,我发现家庭健康管理存在两个普遍痛点:一是药品管理混乱导致过期浪费和错误用药,二是慢性病患者(如糖尿病患者)缺乏便捷的血糖追踪工具。这次基于Flutter for OpenHarmony的技术方案,实现了跨平台的家庭药箱管理与血糖记录一体化解决方案。
选择Flutter+OpenHarmony的组合主要考虑三点:首先,OpenHarmony的分布式能力让手机、平板、智慧屏设备可以协同工作;其次,Flutter的跨平台特性可以覆盖Android/iOS用户;最后,Dart语言的强类型特性在医疗健康类应用开发中能减少运行时错误。实测下来,这套技术栈在华为P50 Pro(HarmonyOS 3.0)上的性能表现接近原生,动画帧率稳定在58-60fps。
2. 系统架构设计
2.1 技术栈选型
- 前端框架:Flutter 3.7(支持空安全)
- 状态管理:Riverpod(比Provider更灵活的依赖注入)
- 本地存储:Hive(二进制存储,比SQLite快3倍)
- 图表库:fl_chart(自定义血糖曲线)
- OpenHarmony适配:通过
flutter_ohos插件调用设备能力
2.2 关键模块划分
dart复制lib/
├── models/ # 数据模型
│ ├── medicine.dart
│ └── glucose.dart
├── services/ # 业务逻辑
│ ├── reminder.dart
│ └── analysis.dart
├── widgets/ # 自定义组件
│ ├── expiry_chart.dart
│ └── trend_line.dart
└── pages/ # 页面层
├── medicine_box/
└── glucose_log/
3. 药箱管理核心实现
3.1 药品信息结构化存储
采用Hive实现高性能本地存储,设计的数据模型包含7个关键字段:
dart复制@HiveType(typeId: 0)
class Medicine {
@HiveField(0)
final String name; // 药品通用名
@HiveField(1)
final String dosage; // 规格(如50mg*12片)
@HiveField(2)
final DateTime expiry; // 有效期
@HiveField(3)
final int stock; // 剩余数量
@HiveField(4)
final String usage; // 用法用量
@HiveField(5)
final Uint8List? image; // 药品照片
@HiveField(6)
final List<Alarm> alarms;// 用药提醒
}
3.2 智能过期预警
实现原理是通过后台任务定期扫描药品数据,当检测到以下情况时触发通知:
- 有效期在30天内 → 黄色预警
- 有效期在7天内 → 红色预警
- 已过期药品 → 立即提醒清理
关键代码片段:
dart复制void checkExpiry() {
final medicines = MedicineService.getAll();
final now = DateTime.now();
for (var med in medicines) {
final daysLeft = med.expiry.difference(now).inDays;
if (daysLeft <= 0) {
showNotification('立即处理', '${med.name}已过期');
} else if (daysLeft <= 7) {
showNotification('紧急', '${med.name}即将过期');
} else if (daysLeft <= 30) {
showNotification('注意', '${med.name}快过期了');
}
}
}
4. 血糖记录专业实现
4.1 多维度数据采集
为满足医学分析需求,记录以下数据点:
- 血糖值(mmol/L)
- 测量时间(晨起空腹/餐后2小时/睡前)
- 伴随症状(头晕、口渴等)
- 当餐饮食照片(可选)
- 胰岛素注射量(如有)
4.2 动态趋势分析
使用fl_chart实现三种专业图表:
- 七日波动图:折线图+正常范围参考线
- 时段对比图:将每日数据按早餐/午餐/晚餐分组对比
- 糖化血红蛋白估算:基于90天数据计算HbA1c近似值
图表配置示例:
dart复制LineChartData getChartData() {
return LineChartData(
lineBarsData: [
LineChartBarData(
spots: glucoseReadings.map((r) =>
FlSpot(r.time.millisecondsSinceEpoch.toDouble(), r.value)
).toList(),
colors: [Colors.red],
barWidth: 2,
isCurved: true,
),
],
titlesData: FlTitlesData(
bottomTitles: AxisTitles(
sideTitles: SideTitles(showTitles: true),
),
leftTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 40,
getTitlesWidget: (value, _) => Text('${value}mmol/L'),
),
),
),
);
}
5. OpenHarmony特色功能适配
5.1 跨设备协同
通过@ohos.distributedHardware模块实现:
- 在智慧屏查看家庭共享药箱
- 手机扫码添加药品后自动同步到平板
- 血糖异常时在多个设备同步提醒
5.2 硬件能力调用
典型场景包括:
- NFC药品识别:读取药品包装NFC标签自动填充信息
- 语音添加记录:"小艺小艺,记录血糖5.6"
- 打印用药清单:通过华为打印机输出纸质版
6. 性能优化关键点
6.1 内存管理技巧
- 使用
compute()隔离耗时操作 - 药品图片采用
cached_network_image+LRU缓存 - 血糖图表数据分页加载(每次加载30天)
6.2 启动速度优化
实测数据对比:
| 优化措施 | 冷启动时间(ms) |
|---|---|
| 未优化 | 1200 |
| 延迟初始化 | 800 |
| 预加载Hive盒子 | 600 |
| AOT编译+代码压缩 | 400 |
7. 隐私与安全设计
7.1 数据加密方案
- 本地存储使用Hive AES加密
- 生物识别(指纹/面部)解锁敏感操作
- 网络传输采用HTTPS+双向证书验证
7.2 权限最小化原则
仅申请必要权限:
xml复制<uses-permission ohos:name="ohos.permission.HEALTH_DATA"/>
<uses-permission ohos:name="ohos.permission.DISTRIBUTED_DATASYNC"/>
8. 实际开发踩坑记录
-
OpenHarmony字体问题:
发现部分华为设备默认字体导致文本溢出,解决方案:dart复制Text( '药品名称', style: TextStyle(fontFamily: 'HarmonyOS Sans'), overflow: TextOverflow.ellipsis, ) -
血糖图表性能:
当数据点超过500个时出现卡顿,最终采用:- 采样降频(每5个点取平均值)
- Canvas离屏渲染
- 手势交互时隐藏辅助线
-
后台提醒失效:
OpenHarmony省电策略会限制后台进程,需要:- 在
config.json声明持续任务权限 - 使用
@ohos.backgroundTaskManager注册持久化任务
- 在
这个项目让我深刻体会到,医疗健康类应用开发需要平衡功能丰富性和操作严谨性。比如在血糖模块,我们增加了二次确认弹窗防止误输入,同时提供快捷录入模式方便老年人使用。后续计划加入药品相互作用检查功能,这需要接入专业医药知识图谱API。