引言
随着 OpenHarmony 生态的快速演进,越来越多团队希望在保留 Flutter 跨端开发效率 的同时,深度集成 OpenHarmony 原生能力(如分布式任务调度、安全沙箱、系统级服务等)。然而,官方并未提供开箱即用的混合工程模板,开发者常陷入以下困境:
- ❌ 不清楚如何将 Flutter 作为 子模块 嵌入 OpenHarmony Stage 模型工程;
- ❌ 插件通信(MethodChannel)配置复杂,容易出错;
- ❌ 构建流程割裂:需分别运行
flutter build和ohpm build; - ❌ 调试困难:无法在 DevEco Studio 中一键启动混合应用。
本文将手把手教你搭建 标准化混合工程结构 ,实现:
✅ OpenHarmony Stage 模型为主工程
✅ Flutter 作为独立模块嵌入
✅ 自动构建 + 热重载支持
✅ 插件通信无缝对接
所有方案基于 OpenHarmony API 10(4.1 SDK) + Flutter 3.19 + DevEco Studio 5.0,已在华为 Pura 70(OpenHarmony 版)实测通过。

一、整体工程结构设计
我们采用 "主从式"架构:OpenHarmony 工程为主容器,Flutter 为子模块。最终目录结构如下:
MyHybridApp/ ← OpenHarmony 主工程(Stage 模型)
├── oh-package.json5 ← 主工程依赖
├── build-profile.json5 ← 构建配置
├── hvigorfile.ts ← 构建脚本(关键!)
├── entry/ ← 默认 Entry 模块(可选)
│ └── src/main/ets/
├── flutter_module/ ← ✅ Flutter 子模块(核心)
│ ├── pubspec.yaml
│ ├── lib/main.dart ← Flutter 入口
│ └── ohos/ ← ✅ OpenHarmony 平台代码
│ ├── module.json5 ← Flutter 模块声明
│ └── src/main/ets/ ← 插件桥接层
│ ├── FlutterBridge.ets ← MethodChannel 实现
│ └── MainUI.ets ← 承载 Flutter 的 Ability
└── hvigorw ← 构建入口(自动生成)
💡 优势:
- Flutter 代码与 OpenHarmony 代码 物理隔离,便于团队分工;
- 通过
hvigorfile.ts实现 一键构建,无需手动编译 Flutter;- 支持 热重载(Hot Reload)调试 Flutter UI。
二、Step 1:创建 OpenHarmony 主工程(Stage 模型)
- 打开 DevEco Studio 5.0+
- 选择 File > New > Create Project
- 模板选择 Application > Empty Ability (Stage)
- 命名项目为
MyHybridApp,语言选 ArkTS
此时生成标准 Stage 模型工程,包含 entry 模块。
三、Step 2:创建 Flutter 子模块
⚠️ 注意:不要 使用
flutter create创建独立 App,而是创建 模块(module)。
在终端中执行:
bash
cd MyHybridApp
flutter create --org com.example --template=module --platforms=ohos flutter_module
关键参数说明:
--template=module:创建可嵌入的模块,非独立 App;--platforms=ohos:仅生成 OpenHarmony 平台代码(节省空间)。
生成后,flutter_module/ 目录结构如下:
flutter_module/
├── lib/
│ └── main.dart
├── pubspec.yaml
└── ohos/
├── module.json5
└── src/main/ets/
四、Step 3:配置 Flutter 模块为 OpenHarmony 模块
1. 修改 flutter_module/ohos/module.json5
将其声明为一个 可被主工程引用的模块:
json5
{
"module": {
"name": "flutter_module",
"type": "feature", // 关键:设为 feature 模块
"srcPath": "./src/main/ets",
"mainElement": "MainUI", // 入口 Ability 名称
"requestPermissions": [
// 按需添加权限,如网络、存储等
]
}
}
2. 创建承载 Flutter 的 Ability(flutter_module/ohos/src/main/ets/MainUI.ets)
typescript
// flutter_module/ohos/src/main/ets/MainUI.ets
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
export default class MainUI extends UIAbility {
async onCreate(want, launchParam) {
console.info('[Flutter] MainUI onCreate');
}
async onWindowStageCreate(windowStage: window.WindowStage) {
// 加载 Flutter 页面
const mainWindow = windowStage.getMainWindowSync();
await mainWindow.setUIContent(this.context, 'flutter_module', 'pages/Index'); // 指向 Flutter 入口
}
onDestroy() {
console.info('[Flutter] MainUI onDestroy');
}
}
📌 注意:
'flutter_module'是模块名,'pages/Index'是虚拟路径,实际由 Flutter 引擎接管。
五、Step 4:配置主工程引用 Flutter 模块
1. 修改主工程 oh-package.json5
json5
{
"modelVersion": "5.0.0",
"name": "MyHybridApp",
"version": "1.0.0",
"dependencies": {
// 其他依赖...
},
"modules": [
"entry",
"flutter_module" // ✅ 添加 Flutter 模块
]
}
2. 修改主工程 build-profile.json5
确保构建时包含 Flutter 模块:
json5
{
"app": {
"products": [
{
"name": "default",
"runtimeOS": "OpenHarmony",
"buildOption": {
"sourceOption": {
"exclude": []
}
},
"modules": [
"entry",
"flutter_module" // ✅
]
}
]
}
}
六、Step 5:实现 MethodChannel 通信(关键!)
1. Flutter 端(flutter_module/lib/main.dart)
dart
// flutter_module/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('OpenHarmony + Flutter 混合工程')),
body: Center(
child: ElevatedButton(
onPressed: _callNative,
child: const Text('调用原生能力'),
),
),
),
);
}
Future<void> _callNative() async {
try {
// 调用 OpenHarmony 原生方法
final String result = await MethodChannel('com.example.hybrid/native')
.invokeMethod('getDeviceInfo');
print('原生返回: $result');
} catch (e) {
print('调用失败: $e');
}
}
}
2. OpenHarmony 端(flutter_module/ohos/src/main/ets/FlutterBridge.ets)
typescript
// flutter_module/ohos/src/main/ets/FlutterBridge.ets
import flutter from '@ohos.flutter';
import deviceInfo from '@ohos.deviceInfo';
// 注册 MethodChannel 处理器
@Entry
@Component
struct FlutterBridge {
aboutToAppear() {
// 绑定通道
flutter.MethodChannel('com.example.hybrid/native').setMethodCallHandler((call) => {
if (call.method === 'getDeviceInfo') {
const info = `设备型号: ${deviceInfo.deviceType}, 系统版本: ${deviceInfo.osFullName}`;
return Promise.resolve(info);
}
return Promise.reject('Method not implemented');
});
}
build() {
// 此组件不渲染 UI,仅用于初始化桥接
Column() {}
}
}
✅ 通道名称必须一致 :
com.example.hybrid/native
七、Step 6:配置自动构建(hvigorfile.ts)
这是实现 一键构建 的核心!在主工程根目录创建/修改 hvigorfile.ts:
typescript
// MyHybridApp/hvigorfile.ts
import { task } from '@ohos/hvigor';
// 自定义任务:构建 Flutter 模块
task('buildFlutter', async () => {
const { execSync } = require('child_process');
console.log('🔍 开始构建 Flutter 模块...');
// 进入 flutter_module 目录并构建
execSync('cd flutter_module && flutter build ohos --release', {
stdio: 'inherit',
shell: true
});
console.log('✅ Flutter 模块构建完成');
});
// 将 buildFlutter 任务插入到主构建流程
task('assemble').dependsOn('buildFlutter');
💡 效果:当你点击 DevEco Studio 的 Build > Build Hap(s) 时,会自动先构建 Flutter 模块。
八、Step 8:运行与调试
1. 首次构建
- 在 DevEco Studio 中点击 Build > Rebuild Project
- 观察控制台输出:应看到
开始构建 Flutter 模块...→Flutter 模块构建完成
2. 运行应用
- 连接 OpenHarmony 设备或启动模拟器
- 点击 Run > Run 'MyHybridApp'
3. 热重载 Flutter(开发阶段)
-
在终端进入
flutter_module目录 -
执行:
bashflutter attach --device-id <你的设备ID> -
修改
lib/main.dart后保存,UI 自动刷新!
🔍 查看设备 ID:
hdc list targets
九、常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
Module 'flutter_module' not found |
检查 oh-package.json5 是否正确引用模块名 |
| MethodChannel 无响应 | 确保通道名称完全一致,且 FlutterBridge 在 UI 初始化前注册 |
| 构建卡在 Flutter 步骤 | 检查 Flutter 环境是否支持 ohos(需 Flutter 3.19+) |
| 热重载不生效 | 确保先运行主 App,再执行 flutter attach |
十、工程结构最佳实践建议
-
命名规范
- Flutter 模块名:
xxx_flutter(如health_flutter) - MethodChannel 前缀:
com.company.app/feature
- Flutter 模块名:
-
插件隔离
- 每个业务功能对应一个
.ets桥接文件(如FileBridge.ets,NotifyBridge.ets)
- 每个业务功能对应一个
-
依赖管理
- Flutter 插件仅在
flutter_module/pubspec.yaml中声明 - OpenHarmony 权限仅在
flutter_module/ohos/module.json5中申请
- Flutter 插件仅在
-
CI/CD 集成
- 在流水线中先执行
flutter pub get,再运行hvigorw assemble
- 在流水线中先执行
十一、总结
通过本文,你已掌握:
✅ 标准化 OpenHarmony + Flutter 混合工程结构
✅ Flutter 作为 feature 模块嵌入 Stage 模型
✅ MethodChannel 双向通信实现
✅ 一键构建与热重载调试配置
这种结构既保留了 Flutter 的跨端开发效率,又充分利用了 OpenHarmony 的系统级能力,是构建 高性能、高合规性 国产化应用的理想方案。
🚀 适用场景:
- 政务 App(需调用安全键盘、电子证照)
- 金融应用(需硬件级加密)
- 智慧医疗(需传感器 + 分布式协同)
- 工业 IoT(需低功耗 + 本地 AI)
