1. 项目背景与技术选型:这条路为什么值得走
我最早接到这个需求时,脑子里第一反应是“又要给冥想应用做鸿蒙版了”。项目本身不复杂——一个带引导呼吸、音频播放、计时打卡的冥想指导应用,但跨平台加上鸿蒙适配,瞬间把难度拉高了几个档次。而实际动手之后,我发现这件事的难点根本不在业务逻辑,而是在“Flutter 框架到底能不能在鸿蒙上舒服地跑起来,以及跑到什么程度”。
先说结论:能用,但需要你接受“社区适配 + 手动桥接”这套玩法。
HarmonyOS NEXT 去掉了 AOSP 以后,很多原来跑在安卓上的东西都不能直接用了,这逼着所有跨平台方案重新找路。Flutter 的跨平台优势和这个场景其实高度契合——冥想应用的核心是 UI 动效、动画过渡、音频交互,几乎没有重原生依赖,这正好是 Flutter 的舒适区。再加上官方和 OpenHarmony SIG 团队一直在维护 flutter_flutter、flutter_engine 的鸿蒙适配分支,到 3.7.x 版本已经能跑通基础渲染和交互链路。
适合谁参考这篇内容?两类人。第一类是手里有现成 Flutter 应用、被要求出鸿蒙版的人,你需要知道怎么把 Android/iOS 工程迁移到 ohos 目录下;第二类是准备从零做一个跨平台贴身工具类应用、又不想写两套代码的人,你可以评估一下 Flutter 打通鸿蒙的真实成本和体验。
我没有选择用 ArkTS 重写一版,也没有等 uni-app 这类框架的鸿蒙适配成熟。原因后面详细说,简单讲就是:团队只有我一个人,业务迭代节奏又不允许我维护两套代码。Flutter 的 UI 一致性和热重载开发效率是我最看重的东西,而鸿蒙端目前只需要保证稳定可用,不需要追最新特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 鸿蒙端的 Flutter 开发环境搭建:从零到跑通首帧
2.1 版本选型和环境清单
如果你在网上搜“Flutter 鸿蒙开发”,会看到一堆过时教程,让你下载 1.x 的 ohos 引擎包或者手动编译引擎,那都是早期方案,别碰。现在成熟路线是直接用 OpenHarmony 签名仓库里维护的 flutter 分支,配合 DevEco Studio 完成构建和签名。
我本人在这个项目里用的版本组合(实测比较稳的一套):
| 组件 | 版本 | 备注 |
|---|---|---|
| Flutter SDK(ohos 分支) | 3.7.12-ohos | 基于 flutter 3.7 的官方适配版,渲染和 PlatformChannel 都可用 |
| Dart SDK | 随 Flutter SDK 内置 | / |
| DevEco Studio | 4.0 Release | 支持 HarmonyOS API 9+,后续新版也兼容 |
| HarmonyOS SDK | API 9+ | module.json5 里声明 |
| Node.js | 16+ | 构建脚本依赖 |
这里特别提醒一点:Flutter ohos 分支的 SDK 不能从 flutter 官网下载,要到 Gitee 的 openharmony-sig 仓库拉对应分支。装好后 flutter doctor 会识别出这是一个自定义 SDK,这很正常,不用慌张。
2.2 环境变量配置和多版本切换
我电脑上有两个 Flutter SDK——一个是官方版,一个是 ohos 分支,日常开发全靠 FVM 管理。如果你还没装 FVM,建议现在就装。命令行里直接跑:
bash复制dart pub global activate fvm
fvm use 3.7.12-ohos
如果不用 FVM,那也要把 ohos 分支的 bin 目录加到 PATH 里。这里有个小坑请注意:刚配置完 PATH 后,打开一个新的终端窗口再跑 flutter --version,不要在旧窗口里直接试,很多教程没说这件事,导致新手以为装失败了。
2.3 创建工程并生成 ohos 目录
Flutter 官方的 flutter create 默认生成的模板只有 android/、ios/、web/ 这些目录,不会自动生成鸿蒙的 ohos/ 目录。你需要手动把鸿蒙壳工程加进来。
具体做法是:先正常创建 Flutter 工程,然后用 DevEco Studio 的“导入”——如果通过空工程向导方式,则会创建标准 HarmonyOS 应用工程结构,再把 Flutter 模块以依赖方式接进 ohos 壳工程里。更常见的社区做法是使用 flutter_flutter 仓库里的 template 直接生成带 ohos 目录的工程。
我当时为了省事,直接找了 OHOS 模板工程再把自己代码拷进去,这种土办法反而最不容易出错。生成完的目录结构大概是:
code复制lib/
main.dart
pages/
models/
services/
ohos/
entry/
src
