从去年开始,我陆续在 OpenHarmony 设备上跑 Flutter 项目,最开始的切入点就是一个看起来毫无技术含量的东西:提示对话框。当时想法很简单,先在国产系统设备上把一个 Flutter 的 AlertDialog 跑通,验证整条链路没问题,再做后续业务。结果这个“简单”的对话框,在真机上折腾了我整整一个周末。对话框闪一下消失、rk3568 开发板不知道选哪个设备树、Flutter SDK 环境变量不生效、输入法把弹窗顶出屏幕……这些问题叠在一起,让我意识到 Flutter for OpenHarmony 的实战资料还是太零散了。这篇文章就把我这次提示对话框的实现过程、遇到的所有坑、以及最终的解决方案一次性写清楚,给准备在 OpenHarmony 上用 Flutter 做业务的开发者一条可以直接抄作业的路径。
1. 先搞清楚:Flutter 在 OpenHarmony 上到底怎么跑起来的
1.1 OpenHarmony 的 Flutter 不是“套壳”,是引擎级适配
很多刚接触这个方向的开发者会有一个误解:OpenHarmony 不是兼容 Android 吗,那我直接把 APK 装上去不就行了?实际上 OpenHarmony 的兼容层主要针对的是 hap 格式的应用以及鸿蒙原生的 ArkUI 接口,Flutter 应用并不直接支持。要在 OpenHarmony 设备上运行 Flutter,靠的是 openharmony-sig 维护的 flutter_flutter、flutter_engine 等仓库,它们做的事情是把 Flutter 引擎真正移植到 OpenHarmony 的底层系统能力之上,通过引擎层的适配让上层 Dart 代码几乎不做修改就能运行。
从 Flutter 开发者的视角来看,这个适配方案带来的最大好处是:UI 层依然是标准的 Widget 树,Dart 语法、状态管理、动画系统、路由机制全部保持不变。也就是说,你在 Android 和 iOS 上写过的那些 dialog 代码、页面跳转逻辑、甚至是第三方纯 Dart 库,大概率可以平移到 OpenHarmony 上。我在实际项目中验证过,一个在 Android 上完美运行的确认对话框,拿到 OpenHarmony 设备上编译运行,UI 表现几乎一致,不需要为了系统差异单独写第二套逻辑。
但需要注意的是,平台通道和原生插件层面就完全是另一回事了。凡是依赖 Android 或 iOS 原生能力的插件,比如微信登录、支付、图库选择,都需要找 OpenHarmony 版本的适配实现,这就是为什么搜索热词里大量出现“flutter 兼容鸿蒙拉起 iap 支付”“flutter 如何调用鸿蒙的图库”这类问题。对话框这种纯 UI 能力不受影响,但一旦对话框背后要调系统能力,就要提前确认插件是否有 ohos 实现。
1.2 为什么从提示对话框入手最合适
提示对话框是 Flutter 应用里最基础的交互组件,但它覆盖的技术点其实非常全面。一个最简单的 AlertDialog,背后涉及 Navigator 路由栈、Future 异步返回值、Widget 生命周期、状态管理、主题样式等多个核心机制。把对话框跑通,等于把 Flutter 在 OpenHarmony 上的运行链路完整验证了一遍。
另外从业务角度看,对话框几乎是所有 App 的刚需。删除数据前的二次确认、退出登录的询问、同步操作的进度提示、拉起支付前的前置说明,这些场景都离不开它。我见过太多团队在 OpenHarmony 上刚起步就急着做核心业务功能,结果卡在环境搭建和各种适配坑里,其实不如先从最基础、最通用的组件入手,把工程底子打扎实,后面业务开发会顺畅很多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工程与设备:从 SDK 环境到 RK3568 开发板的一次理清
2.1 需要准备的工具链与版本匹配
Flutter 在 OpenHarmony 上的开发环境,核心是 openharmony-sig 维护的 flutter_flutter 仓库。大致流程是:把这个仓库 clone 下来,用它的 bin 目录替换掉你本地的 Flutter SDK 路径,再配合 DevEco Studio 自带的 OpenHarmony SDK,配置好环境变量,然后就能用 flutter 命令创建和构建 ohos 平台的项目了。
我整理一下实际步骤供参考,具体以你 clone 的仓库对应版本的 README 为准:
- 安装 DevEco Studio,并完成 OpenHarmony SDK 的下载,记住 SDK 路径。
- clone openharmony-sig 的 flutter_flutter 仓库,我建议放到一个独立的目录,不要和你日常开发用的标准 Flutter SDK 混在一起。
- 将 flutter_flutter 的 bin 目录加入系统 PATH,同时配置好 DEVECO_SDK_HOME 环境变量,指向 OpenHarmony SDK 的 command-line-tools 目录。
- 在终端执行
flutter doctor,确认出现 ohos 相关的工具链检测项,并且没有报红。 - 新建一个 Flutter 工程,执行
flutter create --platforms ohos .或者使用集成到已有工程的方式,生成 ohos 平台目录。 - 连接开发板或者使用模拟器,执行
flutter run -d ohos验证链路。
环境变量配置这个环节,搜索热词里有“flutter 刚装好,path 需要新终端生效”,这是 Windows 和 macOS 下很常见的问题。Windows 下修改环境变量后必须重新打开一个 PowerShell 窗口,macOS 和 Linux 下要记得执行 source ~/.zshrc 或 source ~/.bashrc。我刚开始是在修改完 PATH 后直接复用原有终端,结果 flutter 命令还是报“不是内部或外部命令”,一度以为是安装有问题,其实是 Shell 没有刷新。
2.2 设备和系统镜像:应用开发与系统编译是两件事
OpenHarmony 设备的开发选型,很多人会纠结一个问题:rk3568 开发板那么多设备树,到底该选哪个。这里我要先泼一盆冷水:如果你只是做 Flutter 应用开发,并且拿到手的设备已经是烧录好系统镜像的状态,那么设备树和你没有任何关系。设备树是编译 OpenHarmony 系统镜像时使用的硬件描述文件,它决定了内核识别哪些硬件、加载哪些驱动,这是系统工程师和 BSP 工程师的范畴。
但如果你需要自己给开发板编译系统镜像,那确实会面对设备树选择的问题。以 RK3568 为例,OpenHarmony 适配的官方开发板有 dayu200、dayu210 等型号,对应内核仓库里不同的 dts 文件,比如 rk3568-dayu200.dts。选择依据主要是底板的型号和硬件配置,同样的 RK3568 芯片,不同厂家出的底板在外设引脚定义上可能完全不同,选错了设备树轻则部分外设不工作,重则系统起不来。建议确认好开发板的详细型号和商家提供的适配说明,再去选择对应的 dts。
我的建议是,如果目标是验证 Flutter 应用层,优先选择已经有预编译系统镜像的开发板。拿到手直接烧录镜像、启动系统、连上 adb 或 hdc 就能开始 Flutter 开发。把精力放在应用层,等业务跑通了,需要定制系统时再回头研究设备树,这样学习曲线会平缓很多。
2.3 运行链路验证:第一个 ohos 项目跑起来
环境准备好之后,我强烈建议先不要写任何业务代码,直接跑一个空模板工程,确认 Flutter 引擎能在 OpenHarmony 设备上正常渲染。具体操作是创建一个最简工程,把默认的计数器页面跑起来,然后修改 home 页面的 body,替换成一个简单的按钮,点击后弹出一个最基础的 AlertDialog。这一步跑通了,就说明 Flutter 引擎、Navigator 路由、Dialog 组件三个关键环节在设备上工作正常。
这一步我踩过一个大坑,就是快速连续点击按钮的时候,对话框“闪一下”就消失了,没有任何报错。后面排查了半天,才发现是消息弹窗的 context 在异步回调中失效导致的。这个问题的详细定位过程我在后面专门讲,这里先提醒:如果你也在第一步就遇到类似问题,优先检查是不是在 async 操作后使用了已经失效的 context。
