HarmonyOS鸿蒙Next中使用flutter开发的应用怎么快速的迁移到鸿蒙系统上?

HarmonyOS鸿蒙Next中使用flutter开发的应用怎么快速的迁移到鸿蒙系统上? 具体问题如题,使用flutter本身解决了IOS和安卓的多端的问题,但现在又出现了一个纯血鸿蒙的系统,但是业务又不想专门针对鸿蒙系统做专门的开发,因为招聘和时间成本上的考虑,而且现在鸿蒙本身还存在一些问题待优化,是否有快速将目前flutter开发的应用迁移到鸿蒙系统上的轻量的方式和方法,还麻烦各位大佬给一些意见和建议。

11 回复

【解决方案】

前置条件:完成flutter开发环境配置

github上的一个flutter项目支持HarmonyOS为例:

  1. 从github上克隆flutter_shuqi:
    git clone shuqi仓库地址
  2. 在flutter_shuqi同级目录下执行命令flutter create --platforms ohos flutter_shuqi
  3. flutter_shuqi目录下生成ohos目录。
  4. 连接HarmonyOS真机或者模拟器,执行flutter run
    OpenHarmony组织提供的flutter对flutter tools进行了修改,使用flutter pub getflutter run等命令会自动查找ohos目录,并生成相应的代码和.har包,从而确保可以支持HarmonyOS。

更多关于HarmonyOS鸿蒙Next中使用flutter开发的应用怎么快速的迁移到鸿蒙系统上?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


**方案:**将 Flutter 应用先编译为 Web 版本,再通过鸿蒙系统的 Web 组件嵌入运行

原理:核心是复用 Flutter 的 Web 编译能力 + 鸿蒙的 Web 容器支持,无需重写业务逻辑,仅需处理 Web 与鸿蒙原生的适配层。以下是具体实现思路、步骤及注意事项:

一、核心原理

Flutter 支持将 Dart 代码编译为 Web 应用(基于 CanvasKit 或 HTML 渲染),生成标准的 HTML/CSS/JS 静态资源;而鸿蒙系统(HarmonyOS)的 ArkUI 框架提供了Web组件,可加载本地或远程 Web 资源,并支持 Web 与原生代码的双向通信(如 JS 调用鸿蒙 API、鸿蒙原生向 Web 发送消息)。通过这种方式,Flutter 的业务逻辑(Dart 代码)经编译后以 Web 形式运行,鸿蒙应用仅需作为 “容器” 提供 Web 运行环境,核心代码复用率可达 90% 以上。

二、具体步骤

1. 验证 Flutter 项目的 Web 兼容性

并非所有 Flutter 功能都能无缝编译为 Web,需先确认项目依赖是否支持 Web:

  • 纯 Dart 依赖(如dioproviderflutter_bloc):完全兼容,无需修改。
  • 原生插件依赖(如cameralocationshared_preferences):需替换为 Web 兼容的实现(如shared_preferences_webcamera_web等社区插件),或通过后续 “Web 与鸿蒙桥接” 解决。
  • UI 组件:Flutter 的 Material/Cupertino 组件在 Web 上基本兼容,但复杂动画可能存在性能差异(建议优先用 CanvasKit 渲染模式,减少 UI 失真)。

验证方法:在本地运行flutter run -d chrome,测试核心功能是否正常,修复控制台报错(如未实现的原生方法)。

2. 编译 Flutter 为 Web 静态资源

将 Flutter 项目编译为可部署的 Web 资源,步骤如下:

# 切换到项目目录  
cd your_flutter_project  

# 编译为Web(默认HTML渲染,可选--web-renderer canvaskit启用CanvasKit)  
flutter build web --release --web-renderer canvaskit  

# 生成的资源位于 build/web 目录(包含index.html、main.dart.js、assets等)  

优化建议:

  • 启用 CanvasKit 渲染(--web-renderer canvaskit):减少 UI 在不同设备上的适配问题,尤其对复杂图形更友好(代价是初始加载体积略大)。
  • 压缩资源:通过flutter build web --release --tree-shake-icons移除未使用的图标,减小包体积;对 JS/CSS 资源启用 gzip 压缩。

3. 开发鸿蒙容器应用(加载 Web 资源)

鸿蒙应用需通过Web组件加载 Flutter 编译的 Web 资源,核心是构建一个 “壳应用”,步骤如下:

(1)创建鸿蒙项目

使用 DevEco Studio 创建一个 ArkTS(或 JS)项目,选择 “应用” 模板(无需复杂功能,仅需一个页面承载 Web 组件)。

(2)引入 Web 组件并加载本地资源

将 Flutter 编译的build/web目录下的所有文件复制到鸿蒙项目的entry/src/main/resources/rawfile目录(鸿蒙本地资源目录),然后在 ArkTS 页面中通过Web组件加载:

// 鸿蒙页面代码(ArkTS)  
import web_webview from '@ohos.web.webview';  

@Entry  
@Component  
struct WebContainerPage {  
  private webController: web_webview.WebviewController = new web_webview.WebviewController();  

  build() {  
    Column() {  
      // 加载本地Flutter Web资源(index.html)  
      Web({  
        src: $rawfile('index.html'), // 指向rawfile目录下的index.html  
        controller: this.webController  
      })  
      .javaScriptAccess(true) // 允许Web调用JS(关键:开启Web与原生交互)  
      .onJsMessage((event) => {  
        // 监听Web发送的消息(用于Web调用鸿蒙原生能力)  
        console.log('Web发送消息:' + event.message);  
        return '鸿蒙已收到消息'; // 可向Web返回结果  
      })  
    }  
  }  
}  

说明:

  • $rawfile('index.html'):加载本地静态资源,避免网络依赖(若 Web 资源部署在服务器,可直接填 URL,如src: 'https://your-domain/flutter-web')。
  • javaScriptAccess(true):必须开启,否则 Web 无法与鸿蒙原生通信。

4. 处理 Web 与鸿蒙原生的交互(关键)

Flutter Web 中若需调用设备原生能力(如相机、文件存储、推送等),需通过 “Web JS ↔ 鸿蒙原生” 的桥接实现,步骤如下:

(1)Flutter Web 中定义 JS 交互接口

在 Flutter 代码中,通过dart:jsjs包调用 JS 方法,再由 JS 发送消息给鸿蒙原生:

// Flutter代码(Dart)  
import 'package:js/js.dart' as js;  

// 定义JS桥接方法(调用鸿蒙原生能力)  
void callHarmonyNative(String action, dynamic params) {  
  // 调用全局JS函数,向鸿蒙发送消息  
  js.context.callMethod('sendToHarmony', [action, json.encode(params)]);  
}  

// 使用示例:调用鸿蒙的文件保存功能  
void saveFile(String content) {  
  callHarmonyNative('saveFile', {'content': content});  
}  
(2)在 Web 的 index.html 中添加 JS 桥接逻辑

在 Flutter 生成的index.html中,添加与鸿蒙通信的 JS 代码:

<!-- 位于build/web/index.html的<head>或<body>中 -->  
<script>  
  // 全局函数:接收Flutter的调用,转发给鸿蒙原生  
  function sendToHarmony(action, params) {  
    // 通过鸿蒙Web组件的postMessage发送消息  
    // 注意:鸿蒙Web组件会监听window下的message事件  
    window.postMessage({ action: action, params: params });  
  }  

  // 接收鸿蒙原生发送的消息(如原生能力调用结果)  
  window.addEventListener('message', (event) => {  
    const data = event.data;  
    // 转发给Flutter(通过Dart的js绑定接收)  
    if (window.onHarmonyMessage) {  
      window.onHarmonyMessage(data);  
    }  
  });  
</script>  
(3)鸿蒙原生处理 Web 消息并返回结果

在鸿蒙的Web组件中,通过onJsMessage接收 Web 发送的消息,调用原生 API 后返回结果:

// 鸿蒙ArkTS代码(续上文WebContainerPage)  
.onJsMessage((event) => {  
  const message = JSON.parse(event.message);  
  switch (message.action) {  
    case 'saveFile':  
      // 调用鸿蒙文件存储API  
      this.saveToFile(message.params.content);  
      return '文件保存成功'; // 返回结果给Web  
    case 'getLocation':  
      // 调用鸿蒙位置API  
      const location = this.getLocation();  
      return JSON.stringify(location);  
    default:  
      return '未知操作';  
  }  
})  

// 鸿蒙原生文件保存实现(示例)  
saveToFile(content: string) {  
  // 调用鸿蒙文件管理API(具体需参考鸿蒙文档)  
  console.log('保存内容:' + content);  
}  

5. 测试与优化

  • 性能优化
    • 预加载 Web 资源:鸿蒙应用启动时提前加载index.html,减少白屏时间。
    • 启用缓存:对 Web 资源(如图片、JS)配置鸿蒙的缓存策略,减少重复加载。
  • 兼容性测试
    • 在不同鸿蒙版本(如 API 9/10)的设备上测试,确保Web组件功能正常。
    • 验证复杂交互(如表单输入、滚动、动画)是否流畅,必要时简化 Flutter Web 的 UI 复杂度。

三、优缺点分析

优点

  1. 低成本复用:90% 以上的 Flutter Dart 代码可直接复用,无需为鸿蒙重写业务逻辑,开发成本极低。
  2. 跨平台延续性:同时支持 “Flutter → Web → 鸿蒙” 和 “Flutter → 安卓 /iOS”,维护一套代码即可。
  3. 快速验证:从编译 Web 到嵌入鸿蒙,1-2 天即可完成原型验证,适合短期业务需求。

缺点

  1. 性能损耗:相比原生鸿蒙应用(ArkUI)或 Flutter 直接编译为鸿蒙原生,Web 中间层会增加渲染延迟,复杂 UI(如长列表、3D 动画)可能卡顿。
  2. 原生能力受限:需手动桥接 Web 与鸿蒙原生 API(如相机、蓝牙),开发量随原生功能复杂度增加。
  3. 用户体验差异:Web 应用的交互反馈(如点击响应速度)、页面切换动画可能不如原生流畅,影响体验。

总结

通过 “Flutter → Web → 鸿蒙 Web 组件嵌入” 的方式,可实现低成本迁移,核心是复用 Flutter Web 的编译成果,仅需开发鸿蒙容器和交互桥接层。

希望对您的困惑能带来些许帮助~

开发者社区(如 flutter_harmonyos 插件)提供了一种方案,可以让 Flutter 框架在鸿蒙上运行。这种方法通常是在 Flutter 应用的嵌入层进行适配,以调用鸿蒙系统的原生能力。这可以作为项目前期的探索和过渡方案。

查到有以上的解决方案,就是不确定开发成本是不是比鸿蒙原生开发的成本还要高,而且也不确定这种模式能不能走通,有没有其他的一些坑在里面,有经验的可以帮忙追加一下。

目前HarmonyOS适配的Flutter支持三个版本:

  • 3.7.12版本。
  • 3.22.0版本。
  • 3.27.4版本。

可以参考Flutter-OH版本演进规划和分支策略
HarmonyOS在2025-2026年会基于伙伴诉求调研、社区版本情况,在每年H1、H2分别选择一个版本进行HarmonyOS适配,不会跟随每一个版本。

【解决方案】

1、已有flutter项目适配HarmonyOS,可以参考如下示例;

前置条件:完成flutter开发环境配置
github上的一个flutter项目支持HarmonyOS为例:

  1. 从github上克隆flutter_shuqi:
    git clone shuqi仓库地址
  2. 在flutter_shuqi同级目录下执行命令flutter create --platforms ohos flutter_shuqi。
  3. flutter_shuqi目录下生成如图所示的ohos目录
  4. 连接HarmonyOS真机或者模拟器,执行flutter run。
    OpenHarmony组织提供的flutter对flutter tools进行了修改,使用flutter pub get、flutter run等命令会自动查找ohos目录,并生成相应的代码和.har包,从而确保可以支持HarmonyOS。

2、可以使用flutter已适配的插件:https://gitcode.com/openharmony-tpc/flutter_packages

  1. 一个flutter三方库,若库本身及其所依赖的三方库均无平台化处理逻辑,则表示该库为纯dart库,可以直接在HarmonyOS平台上使用。
  2. 若非纯dart库,需要进行ohos平台化适配,首先在OpenHarmony-SIG组织flutter_packages里寻找是否已经存在,有则可以直接使用;
  3. OpenHarmony-SIG组织flutter_packages里均不存在,则可以自行适配,参考ohos平台适配flutter三方库指导
  • Flutter SDK 仓库是HarmonyOS适配的Flutter SDK,详细的介绍了环境搭建,Flutter命令行,版本说明,FAQ等内容。
  • 开发文档可以指导开发者进行环境搭建、功能开发、三方库、性能调优等工作。
  • Flutter HarmonyOS平台示例代码涵盖了常见的场景demo,需要结合开发文档学习如何开发应用。
  • Flutter packages仓README中以表格形式列举了开发者常用的各种三方库,可以根据功能需要获取相应三方库。
  • Flutter Sig仓涵盖了HarmonyOS相关的三方库,packages仓三方库大多数可以链接到Sig仓。
  • Flutter engine扩展库是Flutter引擎侧源码,允许开发者基于该仓fork到本地自定义构建。

但凡多搜一下也不至于问这个问题🙃,

还望指点,

目前尚无官方工具直接将Flutter应用迁移至鸿蒙Next。Flutter基于Dart语言,鸿蒙Next主要支持ArkTS/JS。需手动重写UI与业务逻辑,使用鸿蒙的声明式开发范式重构界面,调用鸿蒙原生API替换Flutter插件功能。可复用部分Dart业务逻辑代码,但需经类型Script或手动转换。重点关注鸿蒙的FA模型与Stage模型适配。

目前,HarmonyOS Next 对 Flutter 的原生支持还在完善中,但可以通过以下方式尝试轻量迁移:

  1. 使用 ArkTS 适配层:华为提供了部分桥接工具,可将 Flutter 的 Dart 代码通过转换工具映射为 ArkTS 组件,但需手动调整 UI 和 API 调用。建议先对核心业务模块进行针对性移植,减少重构量。

  2. 保留 Flutter 业务逻辑:将数据层和状态管理(如 Bloc、Provider)封装为独立模块,仅替换 UI 层为 ArkUI 组件。这样可复用大部分 Dart 代码,降低重写成本。

  3. 渐进式迁移策略:若应用复杂度高,可先通过鸿蒙的 WebView 或混合开发容器嵌入现有 Flutter 应用,后续逐步替换为原生 ArkTS 页面。注意性能损耗和接口兼容性。

  4. 关注华为官方动态:HarmonyOS Next 正在扩展跨平台框架支持,建议定期查看 DevEco 更新或开源社区(如 OpenHarmony),未来可能有更成熟的迁移方案。

当前阶段需权衡优化成本与业务需求,若鸿蒙用户量暂未形成规模,可暂缓深度适配。

回到顶部