大概一个多月前,我接到一个需求:给家里老人做一款家庭药箱管理App,既想跑在Android手机上,又得适配国产的OpenHarmony开发板。考虑到项目节奏比较紧,我选了Flutter作为跨平台框架,配合flutter_for_openharmony这个适配方案来做UI和业务层。整体做下来,最大的感受是:Flutter跑在OpenHarmony上的路子已经能走通了,但和标准Android开发比起来,坑还是不少,尤其是插件适配和原生权限这块。这篇博文就把我这次从零搭建“家庭药箱管理App”的完整过程写出来,重点拆解设置功能模块的实现思路,给后面想踩这条路的同学一个参考。
如果你正在考虑“Flutter能不能上OpenHarmony”“设置页这种偏系统的功能该怎么做”“药品数据怎么存怎么提醒”,那这篇文章应该能帮上忙。里面没有照抄文档的东西,都是我实际跑通过的代码路径和踩过坑之后的修正方案。
1. 项目整体设计与技术选型思路
1.1 为什么选Flutter跑OpenHarmony,而不是直接上ArkUI
这个项目最开始有个硬约束:同一个App要贴在两个平台上。老人手机上跑Android,家里的智能药箱设备用的是OpenHarmony的RK3566平台。如果各写一套UI逻辑,后续维护成本直接翻倍。所以跨平台方案是刚需。
Flutter在Android、iOS上已经很成熟,但OpenHarmony并不是Flutter官方支持的构建目标。好在社区有flutter_for_openharmony这个适配项目,它做的事情简单说就是把Flutter引擎编译到OpenHarmony的NAPI体系上,让Flutter应用可以以hap包的形式运行。这意味着我可以用完全同一套Dart代码去构建Android APK和OpenHarmony的HAP包。
那为什么不选ArkUI?如果只做OpenHarmony一个平台,ArkUI是更顺的选择,毕竟是系统原生的声明式UI框架,性能和控制力都更好。但问题是时间不允许我重写两套业务逻辑。这次项目选择Flutter不是因为它比ArkUI强,而是因为它让团队可以用一套代码吃下两个平台,而且flutter_for_openharmony的社区活跃度一直不错,踩坑时能找到不少人一起讨论。
1.2 家庭药箱管理的核心需求拆解
接到需求后,我没有急着写代码,先把用户场景列了一遍。家里主要使用者是老人,操作要少、字要大、提醒要显眼。药箱里存的药要能快速定位,过期药要提前预警,降压药之类需要每天定时吃的药不能漏。
拆解下来核心功能就四块:
- 药品档案管理:药名、规格、数量、生产日期、有效期、用法用量、药品照片
- 过期/余量提醒:药品快过期时推送通知,余量小于阈值时提示补充
- 服药计划:针对每天定时服用的药品,设置吃药时间并触发提醒
- 家庭成员与设置:切换家庭成员、管理提醒方式、备份数据等
技术上的难点集中在两块。第一是数据持久化,要同时兼容Android端和OpenHarmony端,不能依赖平台相关性太强的存储接口。第二是本地通知调度,Android上可以用flutter_local_notifications,但OpenHarmony上未必有对应插件,得想别的办法。这两块在整个项目中都磨了很久,后面会详细讲。
1.3 关于设置模块的定位
设置功能在产品里非常容易被轻视,但实际做下来,它反而是连接系统能力和用户偏好的枢纽。这次家庭药箱App里的设置模块承载了几类关键任务:
- 通知开关总控:整个App的提醒中枢,关掉后所有服药提醒、过期提醒都停止
- 默认提醒时间:设置每天提醒的起始时间段,避免半夜被打扰
- 数据管理:备份药品列表到本地文件、从备份恢复数据、清空所有数据
- 关于与帮助:版本号、开源许可、操作指引
这些功能看起来不起眼,但每一条都和系统级能力绑定。比如通知开关要读写系统通知权限,备份要处理文件存储路径,版本号要读取原生包信息。在OpenHarmony上,这些系统能力API和Android不是完全一致的,所以在设置页面里会集中遇到大量平台适配问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与OpenHarmony适配痛点
2.1 flutter_for_openharmony工程怎么配
先把环境整理清楚。我是在macOS上做的开发,宿主Flutter用的是官方稳定版,同时拉了一份flutter_for_openharmony的fork分支作为OpenHarmony构建工具链。
实际步骤大致是这样的:
- 准备OpenHarmony SDK,版本选的是API 9。这个版本对flutter_for_openharmony来说兼容性较好
- 把flutter_for_openharmony的flutter仓库clone下来,用里面的flutter命令替代官方flutter
- 配置DevEco Studio,用于构建hap包,需要设置好OpenHarmony SDK路径
- 创建Flutter工程后,在工程目录下执行flutter create --platforms ohos .来生成ohos平台目录
- 用DevEco Studio打开ohos目录,配置签名后直接构建hap
关键点在于:如果你已经在用官方Flutter写了业务代码,切换到flutter_for_openharmony构建时,Dart层代码基本不用动,但依赖Flutter SDK内部能力的部分需要重新编译。比如我用了image_picker插件,发现它在OpenHa
