做OpenHarmony上的Flutter应用,第一件事就是把“能用”和“好用”分开看。我刚把身体健康状况记录App从Android端迁到OpenHarmony开发板上跑通时,开发同事最关心的问题不是“动画流畅不流畅”,而是“你能不能在平板上快速记一杯水”。这其实很能说明问题:健康类App的核心不是炫技,而是让用户用最少的操作把数据留下来。这次我挑“饮水记录”这个模块完整拆开讲,从数据模型设计、数据库选型、UI实现到真机调试踩坑,整个过程都基于Flutter for OpenHarmony这套技术栈,适合正在做OpenHarmony应用适配、或者想把Flutter项目扩展到国产系统上的开发者参考。
这个功能看起来简单——一个按钮、一个数字、一个进度条。但真正落到OpenHarmony设备上,你会遇到的时间格式、键盘遮挡、数据库并发、设备树选择这些问题,每一个都能耽误你半天。这篇实战记录就把这条完整链路摊开说清楚,你可以直接照着抄,也能当避坑手册用。
1. 先把需求想清楚:饮水记录在健康App里到底是什么
1.1 功能定位与用户场景
我最初接到的需求只有一句话:“做一个能记录每天喝了几杯水的页面。”但这句话其实藏着好几个隐藏问题:一杯是多少毫升?用户是固定杯量还是可以自定义?每天的起点是从零点算还是从起床时间算?要不要显示连续打卡?这些细节如果不在一开始定义清楚,后面改起来就是牵一发动全身。
在实际设计里,我按两个核心场景来拆:一是“快速记录”,用户在喝水后能在一个页面内完成录入,最好一次点击就能完成;二是“当日概览”,用户打开App第一眼就能看到今天喝了多少、离目标还差多少。这两个场景决定了页面信息架构——主页面顶部是今日进度卡片,底部是历史记录列表,中间通过一个悬浮按钮或者底部弹窗触发录入操作,这个布局逻辑在手机和平板上都成立,也是健康类App最常见的信息组织方式。
这里有个容易被忽略的产品细节:要不要记录“喝水时间点”。从用户价值看,记录时间点能支撑后续的喝水习惯分析,比如“午后饮水量偏低”这类提醒;但从MVP阶段看,时间点会增加数据录入负担。我最终选择记录时间戳但不在录入界面强制展示,用户在快速记录时不需要思考“现在几点”,系统自动打点,这个取舍兼顾了数据完整性和操作效率。
1.2 为什么选择Flutter而不是ArkUI或原生
这个项目背景比较现实:团队已经有了一套用Flutter写的健康管理App,包含运动步数、体重曲线、饮食记录等模块,代码量近十万行,不可能因为要适配OpenHarmony就推翻重写。Flutter for OpenHarmony的价值在于,它让我可以把Dart层的大部分业务逻辑、状态管理、路由配置原样保留,只需要处理平台相关的适配层。
选择Flutter还有一个实际考量:OpenHarmony生态里的ArkUI组件库还在快速迭代,很多在业务开发中常用的三方组件(图表、日历、滚动选择器)在ArkUI里要么没有成熟实现,要么需要自己封装。而Flutter侧已经有非常丰富的pub.dev生态,我在饮水记录里用到的进度环、日期选择器、数据库驱动,都能找到经过大量线上验证的成熟方案。在OpenHarmony的发展阶段,直接用Flutter可以让我更关注业务本身,而不是花精力去补组件短板。
当然,Flutter for OpenHarmony并不是零成本。平台通道、文件路径、系统权限这些能力的获取方式和Android不完全一样,后面我会重点讲我在数据库路径和存储权限上踩的坑。
1.3 功能清单与控制范围
我给饮水记录模块划定的MVP范围包括:
- 今日饮水目标设置,默认2000ml,用户可在设置页调整
- 快速饮水录入,支持常用杯量快捷项(200ml/300ml/500ml)和自定义杯量
- 今日饮水进度展示,进度环加数字文案
- 按日查看历史记录,支持前后日期切换
- 数据本地持久化,卸载前不丢失
不做的功能也让整个模块边界清晰:不做喝水提醒推送、不做社交排行榜、不做云端同步。这三点我在需求评审时都明确砍掉了。提醒推送涉及后台任务和系统通知权限,在OpenHarmony上的适配成本暂时不可控;排行榜和云同步需要服务端支撑,会让这个纯客户端实战项目的复杂度上升一个量级。先把本地记录闭环做好,后续再考虑扩展。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境与工程初始化:Flutter for OpenHarmony的落地
2.1 环境准备:Flutter SDK与OpenHarmony SDK
如果你之前只做过Android/iOS的Flutter开发,第一次配置OpenHarmony环境时会有一个明显的认知转变:OpenHarmony对Flutter的支持来自社区的OpenHarmony Flutter分支,而不是flutter官方主干。这意味着你不能直接用flutter SDK里的flutter create生成工程,然后期望它能跑到OpenHarmony设备上。
我当前用的稳定组合是:OpenHarmony 4.1 Release系统 + Flutter SDK的OpenHarmony分支(版本号跟随上游Flutter版本节奏)+ DevEco Studio 4.1。这里的匹配关系很重要,我踩过一次OpenHarmony 3.2系统配新版Flutter分支后,ArkUI的组件桥接层直接编译失败的坑,后来查文档发现是平台API版本不匹配。
环境变量配置上,除了标准的Flutter环境变量外,还要额外配置OpenHarmony SDK路径,并且确认ohpm(OpenHarmony包管理器)命令可用。配置完成后用flutter doctor检查,你会看到多出一个OpenHarmony设备类型的检测项。这一步没有捷径,逐项过,缺什么补什么,尤其是native工具链部分。
2.2 工程初始化与运行目标选择
初始化工程时,我建议不要在已有Android工程上直接改造,而是先新建一个Flutter for
