家里老人的药箱永远一团乱:降压药和感冒药混在一起,过期三个月的阿莫西林还躺在最上层。我决定自己做一个小工具来解决这个问题——一个跑在OpenHarmony设备上的家庭药箱管理App。选型时没有太多犹豫:系统层用OpenHarmony,应用层用Flutter,第一个核心功能就从药品列表开始做。
Flutter for OpenHarmony不是谷歌官方直接支持,而是OpenHarmony SIG维护的Flutter引擎适配分支。好处很直接:Dart代码、Widget树、状态管理、pubspec依赖这些Flutter生态的东西基本都能复用,未来如果想把同一套药箱逻辑搬到手机、平板甚至Windows桌面上,UI部分几乎不用重写。现在OpenHarmony上的原生应用生态确实还在爬坡阶段,很多组件、三方库要么没适配,要么比较粗糙,而Flutter把UI渲染、导航、动画、文本排版这些最烧时间的部分都替你处理好了。
这篇内容我会从选型思路、环境搭建、数据模型、药品列表UI、鸿蒙能力调用,到真机调试时遇到的几个典型问题,一条线讲完。适合手里有RK3568开发板、想在OpenHarmony上跑Flutter应用的朋友,也适合想用Flutter做工具类App但被环境适配劝退的人。
1. 为什么家庭药箱这类轻工具App适合用Flutter跑在OpenHarmony上
1.1 OpenHarmony应用开发现状与Flutter的切入点
先说结论:OpenHarmony要跑业务应用,目前有三条路。
第一条用ArkTS + ArkUI写原生应用,这是系统亲儿子,性能和系统能力调用最好,但问题在于生态太新。你想要的日历控件、图表库、数据库ORM、扫码组件,很多都要自己造轮子,或者从开源社区找半成品改。
第二条用W3C标准写类Web应用,开发快但不适合做需要流畅交互和本地数据库的工具类App,药箱管理这种需要频繁增删改查、列表滚动、状态切换的场景,Web套壳体验不够好。
第三条就是我选的Flutter。Flutter的渲染引擎是自绘的,不依赖系统WebView,也不依赖ArkUI组件库,所以只要OpenHarmony的适配层提供Surface和输入事件通道,Flutter就能跑起来。你写的ListView、Card、TextField、Hero动画,在OpenHarmony和Android上表现高度一致,不存在“换了个系统UI全变样”的问题。
家庭药箱这种App,说实话功能不复杂:药品列表、详情、有效期提醒、用药记录。但它的核心痛点在于“数据维护”和“列表呈现”。Flutter在这两块的优势恰好最强——声明式UI写列表非常顺手,SQLite数据层也成熟。你要在ArkUI里写一套同样流畅的药品列表,不是不行,但需要多花不少时间去补ArkUI的组件知识。
1.2 设备碎片化:RK3568设备树那么多,到底怎么选
OpenHarmony和Android有一个相似的问题:适配的设备很多,每块开发板的硬件配置都不一样。热搜里那句“openharmony的rk3565有许多设备树到底咋选”我太有体会了。RK3568是OpenHarmony社区最常用的开发板芯片之一,但同样是RK3568,开发板可能有不同的DDR配置、不同的显示接口(HDMI、MIPI-DSI、eDP)、不同的触摸屏型号,这些差异都会体现在设备树文件里。
如果设备树选错了,最常见的结果是系统能启动,但Flutter应用黑屏、花屏或者触摸没反应。为什么?因为Flutter的渲染依赖GPU和SurfaceFlinger,设备树里的display节点、GPU节点、iommu节点如果和实际硬件不匹配,引擎创建的Surface就是坏的,上层代码再正确也白搭。
我的经验是:不要自己去翻设备树源码一个个试,优先用你手上的OpenHarmony版本官方镜像里自带的、针对那块开发板的完整设备树。比如你用瑞芯微的RK3568 SDK跑OpenHarmony,就找发布说明里明确标注“RK3568标准版”的镜像。如果一定要自己编译修改,只动你确实需要改的部分,比如屏幕分辨率或触摸IC型号,GPU、显示控制器、内存映射这些节点别碰。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建:Flutter SDK、OpenHarmony SDK与DevEco Studio的三方配合
2.1 三条工具链各自扮演什么角色
在OpenHarmony上跑Flutter,不是装一个Flutter就能完事的,需要搞清楚三套东西各管什么。
Flutter SDK负责Dart编译、Flutter框架代码、pub依赖管理和flutter run命令;OpenHarmony SDK提供ArkTS编译工具链、Native API、资源编译以及最终打包HAP的能力;DevEco Studio则是一个集成开发环境,管理OpenHarmony工程、签名、设备连接和调试。
这三者之间有版本对应关系。flutter_for_openharmony的不同分支通常对应OpenHarmony的不同主版本,比如支持OpenHarmony 4.x的版本,在SDK上可能就有对应的release tag。我的建议是不要盲目追求最新版,先去你用的OpenHarmony SDK发布说明里找“Flutter适配版本”表格,按表格锁定版本再开始。装好之后,在工程目录下检查oh-package.json5和build-profile.json5里声明的SDK版本,跟你本机OpenHarmony SDK版本是否一致,不一致就改配置文件或者重新下载对应SDK。
VSCode能不能写?能,写Dart代码完全没问题。但最后构建HAP、签名、安装到开发板,还是得回到DevEco Studio里操作。我不建议在VSCode里硬扛,除非你只改Dart层代码、构建交给已有的DevEco工程。
2.2 Flutter安装和环境变量的坑:PATH要新终端才生效
Flutter装完之后,很多人的第一个报错是:
bash复制'flutter' is not recognized as an internal or external command
或者Linux/macOS上的:
bash复制flutter: command not found
搜索关键词里那句“flutter 刚装好,path 需要新终端生效”说的就是这个问题。修改完PATH之后,你当前已经打开的那个终端窗口不会自动刷新环境变量,必须重新打开一个终端窗口,或者手动执行source命令。Windows用户注意:只关掉当前标签页再开一个新标签页是不够的,某些终端软件会继承旧环境变量,建议直接退出终端程序重新打开。在macOS上执行:
bash复制source ~/.zshrc
Linux上如果是bash:
bash复制source ~/.bashrc
Windows上还有个细节:把Flutter的bin目录加到用户PATH而不是系统PATH。用户PATH不需要管理员权限,改完生效更快,也避免以后装其他工具时不小心动了系统PATH导致flutter命令失效。
配置完之后,建议先跑一遍:
bash复制flutter doctor
如果OpenHarmony相关的检查项没有显示出来,说明flutter_for_openharmony分支里那个带ohos的doctor检查没被触发,这时候检查一下你是不是真的
