1. 项目背景与需求分析
家庭药箱管理是每个家庭都需要的实用功能,特别是对于有老人、儿童或慢性病患者的家庭。传统纸质记录方式存在易丢失、难查询、无法提醒等问题。基于Flutter和OpenHarmony开发跨平台家庭药箱管理App,能够解决以下痛点:
- 药品信息分散:家中常备药、处方药、保健品等信息分散在不同包装上
- 有效期管理困难:经常出现过期药品未及时清理的情况
- 用药提醒缺失:特殊用药时间(如每8小时一次)容易遗漏
- 知识获取不便:药品相互作用、禁忌等专业信息难以快速查询
本项目将实现核心功能模块:
- 药品信息录入(扫码/手动)
- 有效期提醒(提前30天预警)
- 用药计划设置(周期性提醒)
- 药品知识库(常见药物说明)
- 家庭成员用药档案
2. 技术选型与架构设计
2.1 Flutter+OpenHarmony技术栈优势
选择Flutter for OpenHarmony方案主要基于:
- 开发效率:一套代码同时运行在HarmonyOS和Android/iOS设备
- 性能表现:Skia渲染引擎保证UI流畅度,实测列表滚动FPS≥60
- 生态兼容:通过FFI调用OpenHarmony原生能力(如分布式数据库)
- 维护成本:统一代码库减少多平台适配工作量
技术架构分为三层:
应用层(Dart) ├── 业务逻辑 ├── 状态管理 └── UI组件 框架层(Flutter Engine) ├── Skia渲染 └── Platform Channels 系统层(OpenHarmony) ├── 分布式数据 └── 通知服务2.2 关键组件选型
- 状态管理:Riverpod(比Provider更简洁的语法)
- 本地存储:Hive(高性能NoSQL数据库)
- 网络请求:Dio(支持拦截器和文件上传)
- 扫码功能:mobile_scanner(优化过的相机控制)
- 日期处理:Jiffy(支持中文本地化)
注意:OpenHarmony环境需要额外配置
ohos_mobile_scanner插件,解决鸿蒙相机权限问题
3. 核心功能实现细节
3.1 药品信息录入模块
3.1.1 扫码录入实现
final scannerController = MobileScannerController( detectionSpeed: DetectionSpeed.normal, facing: CameraFacing.back, ); Widget buildScanner() { return MobileScanner( controller: scannerController, onDetect: (capture) { final barcode = capture.barcodes.first; if (barcode.rawValue != null) { _fetchDrugInfo(barcode.rawValue!); // 调用药品API } }, ); }常见问题处理:
- 光线不足时增加对比度:
controller.toggleTorch() - 条码破损时手动输入备用方案
- 国产药品条码兼容性测试(需特别测试69开头码)
3.1.2 表单验证逻辑
final _formKey = GlobalKey<FormState>(); TextFormField( validator: (value) { if (value == null || value.isEmpty) return '必填字段'; if (!RegExp(r'^[\u4e00-\u9fa5a-zA-Z0-9]+$').hasMatch(value)) { return '不能包含特殊字符'; } return null; }, )特殊字段处理:
- 有效期:必须大于当前日期
- 规格:自动补全单位(如500mg)
- 批号:校验符合GMP规范格式
3.2 智能提醒系统
3.2.1 提醒算法设计
void scheduleReminders(Drug drug) { final now = DateTime.now(); final expireDays = drug.expiryDate.difference(now).inDays; if (expireDays <= 30) { _setNotification( title: '药品即将过期', body: '${drug.name}将在$expireDays天后过期', scheduledDate: drug.expiryDate.subtract(const Duration(days: 7)), ); } drug.usage.forEach((time) { _setDailyReminder( drugName: drug.name, dosage: time.dosage, hour: time.hour, minute: time.minute, ); }); }优化点:
- 节假日用药提醒延后1小时
- 已读提醒自动标记为完成
- 紧急药品(如急救药)使用红色预警
3.2.2 OpenHarmony分布式提醒
通过@ohos.distributedHardware.deviceManager实现:
- 注册设备状态监听
- 跨设备同步提醒状态
- 手机/手表/平板多端提醒
// OpenHarmony侧代码 deviceManager.on('deviceStateChange', (data) => { if (data.deviceState === 'online') { syncReminders(data.deviceId); } });3.3 药品知识库建设
3.3.1 数据结构设计
class DrugKnowledge { final String id; final String genericName; // 通用名 final String tradeNames; // 商品名(多个用逗号分隔) final String category; // 处方/OTC/保健品 final String indications; // 适应症 final String contraindications; // 禁忌 final String interactions; // 相互作用 final String sideEffects; // 副作用 final String dosage; // 用法用量 final String storage; // 存储条件 }3.3.2 本地搜索优化
使用Hive的全文检索功能:
final knowledgeBox = await Hive.openBox<DrugKnowledge>('knowledge'); final results = knowledgeBox.values.where((item) { return item.genericName.contains(query) || item.tradeNames.split(',').any((name) => name.contains(query)); }).toList();性能优化技巧:
- 建立拼音索引(如"布洛芬"对应"buluofen")
- 热门药品缓存到内存
- 相似药品推荐算法
4. 界面设计与用户体验
4.1 主界面布局方案
采用瀑布流+卡片式设计:
GridView.builder( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 0.8, ), itemBuilder: (context, index) { return DrugCard( drug: _drugs[index], onTap: () => _showDetail(_drugs[index]), ); }, )视觉优化点:
- 过期药品卡片自动变灰
- 3天内到期药品显示红色边框
- 常用药品置顶显示
4.2 深色模式适配
ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: Colors.blue, brightness: Brightness.dark, // 自动切换 ), useMaterial3: true, )关键颜色变量:
- 药品分类色标
- 紧急程度色阶
- 交互状态反馈色
5. 测试与性能优化
5.1 关键测试用例
| 测试类型 | 测试场景 | 预期结果 |
|---|---|---|
| 功能测试 | 扫码已过期药品 | 显示红色警告标志 |
| 性能测试 | 加载1000条记录 | 滚动流畅(>55FPS) |
| 兼容测试 | 鸿蒙2.0/3.0设备 | 功能正常无崩溃 |
| 安全测试 | 输入特殊字符 | 自动过滤HTML标签 |
5.2 性能优化实践
图片缓存:使用
cached_network_image插件CachedNetworkImage( imageUrl: drug.imageUrl, placeholder: (_, __) => const ProgressIndicator(), )列表优化:
ListView.builder+AutomaticKeepAlive数据库索引:对常用查询字段建立Hive索引
内存管理:
Dispose所有Controller
6. 项目部署与发布
6.1 OpenHarmony适配要点
修改
build.gradle:ohos { compileSdkVersion 8 defaultConfig { compatibleSdkVersion 8 } }添加鸿蒙权限声明:
<abilities> <ability ohos:name=".MainAbility" ohos:type="page" ohos:distributedNotificationEnabled="true"/> </abilities>
6.2 多平台打包策略
使用同一代码库生成不同平台包:
# 构建APK flutter build apk --target-platform android-arm64 # 构建HarmonyOS包 flutter build ohos --release实测数据:
- APK大小:18.6MB
- HAP大小:22.3MB(含ARM库)
- 冷启动时间:<1.2s
7. 扩展功能与未来迭代
- 智能推荐:基于用药记录推荐常备药
- 家庭共享:通过分布式数据库同步数据
- 语音交互:集成鸿蒙语音SDK
- 应急指南:常见急症处理流程图
实际开发中发现几个值得注意的点:
- 鸿蒙相机API需要单独处理权限
- 分布式数据库同步存在200ms左右延迟
- 药品条码库需要定期更新(建议每月同步)
- 老年模式需要特别加大字体和按钮
这个项目最让我意外的是Flutter在OpenHarmony上的性能表现,在搭载HarmonyOS 3.0的MatePad上,列表滚动性能甚至优于同配置Android设备。未来考虑用FFI直接调用鸿蒙的AI引擎来实现更智能的用药建议。