创建混合工程:OpenHarmony Stage 模型 + Flutter 模块标准结构详解

引言

随着 OpenHarmony 生态的快速演进,越来越多团队希望在保留 Flutter 跨端开发效率 的同时,深度集成 OpenHarmony 原生能力(如分布式任务调度、安全沙箱、系统级服务等)。然而,官方并未提供开箱即用的混合工程模板,开发者常陷入以下困境:

  • ❌ 不清楚如何将 Flutter 作为 子模块 嵌入 OpenHarmony Stage 模型工程;
  • ❌ 插件通信(MethodChannel)配置复杂,容易出错;
  • ❌ 构建流程割裂:需分别运行 flutter buildohpm 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 模型)

  1. 打开 DevEco Studio 5.0+
  2. 选择 File > New > Create Project
  3. 模板选择 Application > Empty Ability (Stage)
  4. 命名项目为 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 目录

  • 执行:

    bash 复制代码
    flutter 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

十、工程结构最佳实践建议

  1. 命名规范

    • Flutter 模块名:xxx_flutter(如 health_flutter
    • MethodChannel 前缀:com.company.app/feature
  2. 插件隔离

    • 每个业务功能对应一个 .ets 桥接文件(如 FileBridge.ets, NotifyBridge.ets
  3. 依赖管理

    • Flutter 插件仅在 flutter_module/pubspec.yaml 中声明
    • OpenHarmony 权限仅在 flutter_module/ohos/module.json5 中申请
  4. CI/CD 集成

    • 在流水线中先执行 flutter pub get,再运行 hvigorw assemble

十一、总结

通过本文,你已掌握:

标准化 OpenHarmony + Flutter 混合工程结构

Flutter 作为 feature 模块嵌入 Stage 模型

MethodChannel 双向通信实现

一键构建与热重载调试配置

这种结构既保留了 Flutter 的跨端开发效率,又充分利用了 OpenHarmony 的系统级能力,是构建 高性能、高合规性 国产化应用的理想方案。

🚀 适用场景

  • 政务 App(需调用安全键盘、电子证照)
  • 金融应用(需硬件级加密)
  • 智慧医疗(需传感器 + 分布式协同)
  • 工业 IoT(需低功耗 + 本地 AI)

https://openharmonycrossplatform.csdn.net/content

相关推荐
张风捷特烈1 小时前
Flutter TolyUI 框架#11 | 标签 tolyui_tag
前端·flutter·ui kit
晚霞的不甘1 小时前
[鸿蒙2025领航者闯关]: Flutter + OpenHarmony 安全开发实战:从数据加密到权限管控的全链路防护
安全·flutter·harmonyos
小白|1 小时前
【OpenHarmony × Flutter】混合开发高阶实战:如何统一管理跨平台状态?Riverpod + ArkTS 共享数据流架构详解
flutter·架构
kirk_wang1 小时前
Flutter connectivity_plus 在鸿蒙端的完整适配指南:从原理到实践
flutter·移动开发·跨平台·arkts·鸿蒙
帅气马战的账号1 小时前
开源鸿蒙+Flutter 分布式组件通信与状态一致性保障指南
flutter
吃好喝好玩好睡好1 小时前
OpenHarmony 分布式环境下 Electron+Flutter 应用的增量更新设计
分布式·flutter·eclipse·electron
帅气马战的账号2 小时前
Flutter 跨端状态管理与高性能渲染终极指南——开源鸿蒙生态深度适配
flutter
遝靑2 小时前
Flutter 3.22+ 高性能开发实战:从状态管理到原生交互全解析
flutter
解局易否结局2 小时前
Flutter:开启跨平台开发的全新范式
flutter