1. 项目背景与核心价值
作为一名同时接触过Flutter和OpenHarmony的开发者,我发现将Flutter框架应用于OpenHarmony生态具有独特的实践价值。这次要分享的是一个家庭药箱管理App的完整开发过程,重点会解析用药提醒功能的实现细节。
为什么选择这个组合?Flutter的跨平台特性可以让我们用一套代码同时覆盖Android、iOS和OpenHarmony设备,而OpenHarmony作为新兴操作系统,其分布式能力特别适合家庭健康场景。想象一下:老人的智能手表(运行OpenHarmony)收到用药提醒后,可以自动同步到家庭其他成员的手机上,这就是分布式能力的魅力。
这个项目主要解决三个痛点:
- 家庭药品管理混乱,经常出现过期药品未及时清理
- 用药时间不规律,特别是需要多种药物配合时容易遗漏
- 家庭成员间用药信息不透明,照顾老人时难以掌握准确用药情况
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与项目初始化
2.1 Flutter for OpenHarmony环境配置
首先需要搭建特殊的开发环境。由于OpenHarmony对Flutter的支持还在完善中,我们需要使用社区维护的flutter_ohos插件:
bash复制flutter pub add flutter_ohos
环境配置有几个关键点需要注意:
- 必须使用Flutter 3.0+版本
- OpenHarmony SDK需要配置到环境变量中
- 开发机建议使用华为DevEco Studio作为辅助工具
重要提示:在pubspec.yaml中需要显式声明ohos相关依赖,否则打包时会缺少关键组件。我踩过的坑是忘记添加ohos_network插件导致提醒功能无法联网同步。
2.2 项目结构设计
采用典型的Flutter分层架构,但针对OpenHarmony做了特殊适配:
code复制lib/
├── main.dart # 入口文件
├── models/ # 数据模型
│ ├── medicine.dart
│ └── reminder.dart
├── services/ # 业务逻辑
│ ├── notification.dart
│ └── sync.dart # OpenHarmony分布式同步
├── pages/
│ ├── home.dart # 主页
│ └── add_medicine.dart
└── widgets/ # 公共组件
└── reminder_card.dart
特别要注意的是sync.dart文件,这是实现OpenHarmony分布式能力的关键。通过@ohos.distributedHardware模块,我们可以实现跨设备的数据同步。
3. 核心功能实现细节
3.1 药品数据建模
药品数据模型需要包含以下关键字段:
dart复制class Medicine {
final String id;
final String name;
final String dosage; // 剂量
final DateTime expiryDate;
final String imageUrl; // 药品照片
final List<Reminder> reminders;
// 重要:添加toMap方法用于OpenHarmony分布式传输
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
// 其他字段...
};
}
}
3.2 用药提醒系统实现
提醒功能是本App的核心,采用分层提醒策略:
- 本地通知层:使用flutter_local_notifications插件
- 分布式提醒层:通过OpenHarmony的分布式能力同步到其他设备
- 云端备份层:防止设备丢失导致数据遗失
关键代码片段:
dart复制void scheduleReminder(Reminder reminder) async {
// 1. 设置本地通知
await flutterLocalNotificationsPlugin.show(
reminder.hashCode,
'用药提醒:${reminder.medicineName}',
'请服用 ${reminder.dosage}',
NotificationDetails(...),
);
// 2. 分布式同步
if (isOpenHarmony) {
final distributedHelper = DistributedHelper();
await distributedHelper.syncReminder(reminder);
}
}
3.3 OpenHarmony特有功能集成
在OpenHarmony设备上,我们可以利用这些特有功能增强体验:
- 分布式数据库:实时同步家庭成员的用药记录
- 原子化服务:无需安装完整App即可接收关键提醒
- 智慧屏协同:在电视上显示全家用药日历
实现示例:
dart复制// 分布式数据同步
void syncToFamilyDevices(Medicine medicine) async {
final distributedDataManager = DistributedDataManager();
await distributedDataManager.syncData(
deviceIds: ['family_watch_1', 'family_phone_2'],
data: medicine.toMap(),
priority: SyncPriority.HIGH,
);
}
4. UI设计与交互优化
4.1 药箱主页设计
采用瀑布流布局展示药品,关键交互细节:
- 左滑快速设置提醒
- 长按显示药品详情
- 下拉刷新同步分布式数据
dart复制ListView.builder(
itemCount: medicines.length,
itemBuilder: (ctx, index) {
return Dismissible(
key: Key(medicines[index].id),
background: Container(color: Colors.blue),
secondaryBackground: Container(color: Colors.red),
onDismissed: (direction) {
if (direction == DismissDirection.endToStart) {
_deleteMedicine(index);
} else {
_showReminderDialog(index);
}
},
child: MedicineCard(medicine: medicines[index]),
);
},
)
4.2 提醒列表实现
提醒列表需要特殊处理时间显示和状态管理:
- 使用TimeOfDay类型存储具体时间
- 实现智能排序:即将到来的提醒置顶
- 添加滑动完成交互
dart复制List<Reminder> _sortReminders(List<Reminder> reminders) {
return reminders..sort((a, b) {
final now = TimeOfDay.now();
final aDiff = a.time.hour * 60 + a.time.minute - now.hour * 60 - now.minute;
final bDiff = b.time.hour * 60 + b.time.minute - now.hour * 60 - now.minute;
return aDiff.compareTo(bDiff);
});
}
5. 调试与性能优化
5.1 常见问题排查
-
通知不显示问题:
- 检查OpenHarmony的通知权限
- 验证分布式能力是否开启
- 测试时注意设备时区设置
-
数据同步失败:
bash复制# 查看分布式日志 hdc shell hilog | grep Distributed -
性能优化技巧:
- 对药品图片使用缓存
- 分布式同步采用差异更新
- 提醒列表使用懒加载
5.2 关键性能指标
通过DevEco Studio的性能分析器,我们重点关注:
- 通知触发延迟:控制在500ms以内
- 分布式同步耗时:平均不超过1.5s
- 列表滚动帧率:稳定在60fps
6. 测试与发布
6.1 多设备测试方案
由于涉及分布式场景,测试矩阵需要覆盖:
- 手机+手表组合
- 不同OpenHarmony版本
- 跨品牌设备(如华为+第三方设备)
6.2 发布注意事项
OpenHarmony应用发布有几个特殊要求:
- 必须申请分布式能力权限
- 需要提供原子化服务描述文件
- 鸿蒙应用市场的审核标准不同
经验分享:首次提交时因为缺少原子化服务描述被拒,建议提前准备以下文件:
- atomic_service_profile.json
- distributed_capabilities.json
7. 扩展功能思路
在实际使用中,我发现这些功能也很实用:
- 药品OCR识别:拍照自动填充药品信息
- 用药记录统计:生成周/月报告
- 紧急联系人通知:多次错过用药时自动通知家人
实现OCR识别的代码结构建议:
dart复制class MedicineOCR {
Future<Medicine> recognizeFromImage(String imagePath) async {
// 调用华为ML Kit或第三方API
// 返回结构化药品数据
}
}
这个项目最让我惊喜的是OpenHarmony的分布式能力,当老人的智能手表震动提醒用药时,我的手机同步显示这条提醒的状态,这种无缝体验是传统开发方式难以实现的。对于想尝试Flutter+OpenHarmony的开发者,我的建议是从小功能点开始,逐步体验分布式编程的独特魅力。
