前阵子接了个活儿,要把一套 Flutter 写的库存管理应用跑上鸿蒙平板。第一反应倒不是兴奋,而是心里打鼓:Flutter 真能上鸿蒙吗?等我把环境跑通、把业务里最复杂的 GridView 交互一个个搬过去之后才发现,这件事没想象中那么吓人,但坑是真的不少。这篇就把我这次“Flutter + 鸿蒙 + GridView 交互”的完整过程、踩坑记录和性能优化思路都写出来,给同样在做跨平台适配的朋友当个参考。
1. 先说结论:Flutter 跑鸿蒙的可用路线与我的选型理由
当时摆在面前的路有三条:纯 ArkTS/ArkUI 重写、WebView 套壳、用社区维护的 Flutter 鸿蒙适配 SDK。我自己做了个对比表,选型时一目了然:
| 路线 | 改造成本 | 性能 | 插件生态 | 对现有业务代码的复用度 |
|---|---|---|---|---|
| ArkTS 重写 | 极高,页面全部推倒重来 | 原生级 | 鸿蒙生态插件 | 几乎为零 |
| WebView 套壳 | 低,包一层壳就行 | 列表稍长就卡,交互动画差 | Web 生态 | 看 H5 覆盖率 |
| Flutter 适配 SDK | 中,主要改原生依赖和少量 UI | 接近原生 | Flutter 插件大部分可用 | Dart 层代码几乎全复用 |
我的结论很直接:ArkTS 重写成本太高,WebView 套壳又没法保证 GridView 这种高频滚动页面的体验,所以最终选了 Flutter 鸿蒙适配 SDK 这条路线。 核心诉求是“用最低改造成本把现有 GridView 和业务逻辑跑起来”,而 Flutter 的适配方案恰好能最大化复用 Dart 层代码。
这里要提醒一句:Flutter 官方主分支目前并没有把鸿蒙作为一等平台来支持,真正可用的是 OpenHarmony SIG 维护的 flutter_flutter 分支,以及配套的 flutter_ohos 引擎。选型的时候一定要确认版本分支和你的 OpenHarmony SDK 版本能对应上,否则后面 compile 的时候会冒出来一堆不明不白的错误。
另外一个比较容易忽略的点:插件兼容性。 你原来在 Android 上依赖的第三方库,如果涉及原生平台通道(比如高德地图、微信登录),在鸿蒙上大概率是要替换成鸿蒙版本的实现,或者自己写平台通道对接。我在这个项目里最典型的一个例子就是底部弹窗里的 TextField,Android 上好好的,跑到鸿蒙上键盘弹起来后整个布局被顶得乱七八糟,后面会细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境与工程改造:从 Android 工程到鸿蒙 hap 的迁移过程
2.1 环境准备与 SDK 切换
环境这块不复杂,但步骤容易漏。我的做法是:
- 安装 DevEco Studio,配好 OpenHarmony SDK。
- 把 Flutter SDK 从官方稳定版切到适配鸿蒙的 flutter_flutter 分支,仓库地址和分支名在 OpenHarmony SIG 的说明里有,照着来。
- 在环境变量里补充
OHOS_SDK_HOME、DEVECO_SDK_HOME这些路径,不然 hvigor 找不到 SDK。 - 用
hdc list targets确认能用命令行连上鸿蒙设备,这一步非常关键,后面所有安装调试都依赖它。
2.2 工程目录的变化
Flutter 工程里默认有 android/ 和 ios/ 目录,鸿蒙适配之后多了一个 ohos/ 目录。我看下来结构是模仿 Android 工程的,但有一些自己特有的文件:
entry/src/main/module.json5:相当于 Android 的 AndroidManifest,配置 abilities、页面入口、权限声明。build-profile.json5:相当于 build.gradle,配置签名、模块依赖。hvigorfile.ts:构建脚本入口。
从 Android 工程迁移到鸿蒙,我的步骤是:先把 ohos/ 目录用模板生成出来,再把原来 Android 里申请的那些权限(网络、存储、相机等)在 module.json5 里重新声明一遍,最后把 android/gradle.properties 里的一些构建参数手动映射到 hvigor 体系里。
2.3 集成过程中的两个大坑
第一个坑是 Flutter 引擎编译出来之后,页面白屏或者滚动无响应。 我第一次把 hap 装到真机上,应用能起来,但 GridView 一动不动。查了半天,发现问题是引擎跑在了错误的 surface 实现上,没有用 ohos 平台的渲染表面。解决方式就是确保编译用的 SDK 是鸿蒙适配分支,并且在构建时不要手动混入官方 Flutter 引擎产物。
第二个坑是 MissingPluginException。 原来在 Android 上用的一些插件在鸿蒙上没有原生实现,运行时直接抛异常。排查思路是先看 flutter logs,找到具体是哪个 channel 没有实现,然后去 pub.dev 找鸿蒙版本的替代品,或者从 OpenHarmony 的三方库索引里找适配过的插件。
提示:如果插件涉及的是很通用的能力,比如路径获取、网络状态、本地存储,通常都有适配版;但如果是
