前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙版 Flutter 升级 ohos 构建过程:支持依赖插件源码构建

鸿蒙版 Flutter 升级 ohos 构建过程:支持依赖插件源码构建

作者头像
徐建国
发布于 2025-05-08 08:09:47
发布于 2025-05-08 08:09:47
16500
代码可运行
举报
文章被收录于专栏:个人路线个人路线
运行总次数:0
代码可运行

前言

在鸿蒙版 Flutter 开发过程中,我们曾面临两大挑战:一是配置文件的频繁修改易导致提交冲突,二是插件开发时缺乏代码提示。为解决这些问题,本次更新引入了 Hvigor 插件,实现动态配置更新,并支持直接依赖插件源码进行构建,显著提升开发体验。

一、对于 flutter app 项目

背景说明

由于构建产物位置变更,需对项目配置进行相应调整,以适配新的构建流程。

具体步骤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **调整 .gitignore 文件**

在 ohos/.gitignore 中添加以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/package.json
/package-lock.json

同时移除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*.har

对应的项目里自动生成的 har 文件夹也可以直接删除。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **修改 oh-package.json5 文件**

移除 ohos/oh-package.json5 中 dependencies 的 @ohos/flutter_ohos,以及 overrides 中的 @ohos/flutter_ohos 和 flutter 插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3. **添加 Hvigor 插件**

在 ohos/hvigorfile.ts 中添加 Hvigor 插件 flutterHvigorPlugin,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import path from 'path'
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { flutterHvigorPlugin } from 'flutter-hvigor-plugin';

export default {
    system: appTasks,
    plugins:[flutterHvigorPlugin(path.dirname(__dirname))]
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4. **创建 hvigorconfig.ts 文件**

添加 ohos/hvigorconfig.ts 文件,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import path from 'path'
import { injectNativeModules } from 'flutter-hvigor-plugin';

injectNativeModules(__dirname, path.dirname(__dirname))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5. **修改 entry/hvigorfile.ts 文件**

修改 ohos/entry/hvigorfile.ts 文件为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { hapTasks } from '@ohos/hvigor-ohos-plugin';
export default {
    system: hapTasks,
    plugins: []
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
6. **更新 oh-package.json5 文件**

移除 ohos/entry/oh-package.json5 中 dependencies 的 @ohos/flutter_ohos 以及 flutter 插件。

二、对于 flutter module 项目

基于 Har 产物

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **移除 flutter 相关依赖**

在 host 工程下 oh-package.json5 中移除 dependencies 和 overrides 中的 flutter 相关依赖(如不存在则无需处理)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **添加 Har 产物路径**

在 host 工程下 oh-package.json5 的 overrides 中添加所有 flutter 构建出的 har 产物路径,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"overrides": {
    "@ohos/flutter_ohos": "file:./path/flutter_project/build/ohos/har/release/flutter.har",
    "@ohos/flutter_module": "file:./path/flutter_project/build/ohos/har/release/flutter_module.har",
    "plugin_x": "file:./path/flutter_project/build/ohos/har/release/plugin_x.har",
}

当项目中插件较多且有变动时,可在 host 工程的 hvigorfile.ts 中添加以下代码实现动态添加 overrides:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import fs from'fs'
import path from'path'
import { OhosPluginId } from'@ohos/hvigor-ohos-plugin';
import { getNode, hvigor } from'@ohos/hvigor'

const directory = '替换为 har 产物目录路径'
const rootNode = getNode(__filename)
rootNode.afterNodeEvaluate(node => {
const appContext = node.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext
let overrides = appContext.getOverrides() ?? {}
const files = fs.readdirSync(directory)
for (const file of files) {
    if (path.extname(file).toLowerCase() !== '.har') {
      continue
    }
    let depName = path.parse(file).name
    switch (depName) {
      case'flutter':
        depName = '@ohos/flutter_ohos'
        break
      case'flutter_module':
        depName = '@ohos/flutter_module'
        break
    }
    overrides[depName] = `file:${path.join(directory, file)}`
  }
  appContext.setOverrides(overrides)
})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3. **添加依赖**

在 entry(或其他 hap 模块)的 oh-package.json5 的 dependencies 中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    "@ohos/flutter_ohos": "",
    "@ohos/flutter_module": "",
}

如果本模块直接使用了某些 Flutter 插件中的 API,则需添加相应插件的依赖,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    ...
    "plugin_x": ""
}

基于源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **配置 hvigorconfig.ts 文件**

在 host 工程下创建或修改 hvigorconfig.ts 文件(如果没有需新建),添加以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { injectNativeModules, getFlutterProjectPath } from './path/flutter_project/.ohos/include_flutter';

injectNativeModules(__dirname, getFlutterProjectPath(), 1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **更新 hvigorfile.ts 文件**

在 host 工程下的 hvigorfile.ts 中添加 flutterHvigorPlugin 插件,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { flutterHvigorPlugin, getFlutterProjectPath } from './path/flutter_project/.ohos/include_flutter';

export default {
  system: appTasks,
  plugins:[flutterHvigorPlugin(getFlutterProjectPath(), 1)]
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3. **移除 flutter_module**

在 host 工程下 build-profile.json5 中移除 flutter_module。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4. **移除 flutter 相关依赖**

在 host 工程下 oh-package.json5 中移除 dependencies 和 overrides 中的 flutter 相关依赖(如不存在则无需处理)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5. **添加依赖**

在 entry(或其他 hap 模块)的 oh-package.json5 的 dependencies 中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    "@ohos/flutter_ohos": "",
    "@ohos/flutter_module": "",
}

如果本模块直接使用了某些 Flutter 插件中的 API,则需添加相应插件的依赖,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    ...
    "plugin_x": ""
}

三、对于 flutter plugin 项目

可选修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. **更新 hvigorfile.ts 文件**

将插件项目下的 hvigorfile.ts 改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { harTasks } from '@ohos/hvigor-ohos-plugin';
export default {
    system: harTasks,
    plugins: []
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2. **移除 dependencies**

在插件项目下 oh-package.json5 中移除 dependencies 的 @ohos/flutter_ohos。

必须修改

插件 example 的调整请参考前述的 flutter app 项目部分。

总结

本次鸿蒙版 Flutter 优化 ohos 构建过程,通过引入 Hvigor 插件实现了动态配置更新,有效避免了配置文件频繁修改引发的提交冲突。同时,支持直接依赖插件源码进行构建,极大地提升了插件开发体验,使其与 AndroidiOS 平台保持一致。调整后,构建产物统一存放于 flutter 项目的 build/ohos 目录下。对于既有项目,需按照上述步骤手动调整,调整完成后执行 flutter pub get 即可。大家可关注相关 pr[1],待其合并后,便可以按照这种方式进行构建。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大前端之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
鸿蒙Flutter实战:07-混合开发
将flutter module打包成har包,在原生鸿蒙项目中,以har包的方式引入。
少湖说
2024/10/22
3240
鸿蒙Flutter实战:07-混合开发
鸿蒙多环境配置二
你是否每次手动更改发布证书打app包上加应用市场呢?你是否每次打完包都手动在名称后添加版本号和时间呢?不同环境的依赖包经常打包时忘记改呢?其实这些鸿蒙都支持动态配置。
龙儿筝
2024/11/19
1050
鸿蒙多环境配置二
鸿蒙Flutter实战:09-现有Flutter项目支持鸿蒙
原有项目保持模块化,拆分为 apps/common/components/modules/plugins等目录,如下所示:
少湖说
2024/10/22
5530
鸿蒙Flutter实战:09-现有Flutter项目支持鸿蒙
HarmonyOS 开发实践 —— 基于hvigor插件定制构建
在编译构建的过程中如何插入使用者需要的自定义构建任务,使用者可以通过什么方式获取扩展编译构建参数从而在运行时获取自定义的参数以及自定义修改编译产物属性。
小帅聊鸿蒙
2024/11/24
2410
HarmonyOS 开发实践 —— 基于hvigor插件定制构建
Flutter鸿蒙终端一体化-珠联璧合
下面是以Flutter工程为主的鸿蒙混编项目结构,和纯Flutter工程结构基本一致,鸿蒙的Native功能,都写在ohos目录下,这就是一个完整的鸿蒙Native工程,可以直接使用DevECO Studio打开。
用户1907613
2024/02/06
1.1K0
Flutter鸿蒙终端一体化-珠联璧合
HarmonyOS NEXT-Flutter混合开发之鸿蒙-代码实践
在 Flutter 三端分离模式下完成纯血鸿蒙混入的过程中,虽然官方文档提供了一定的指导,但实际操作中可能会遇到一些坑。以下是我在适配过程中的一些经验总结,供各位开发者参考 😄 如果有帮助点个赞。
用户8181473
2025/03/17
2240
现有 Flutter 项目支持鸿蒙
最近这关税战打的是不亦说乎,从另一方面来说,国产替代浪潮奔涌,鸿蒙适配已成为一个必答题,这里面跨端框架是破局多 OS 割裂的最优解。比如 Flutter,之前有很多 app 可能是用 Flutter 做的,那么如何支持鸿蒙呢?
徐建国
2025/04/15
1.2K0
现有 Flutter 项目支持鸿蒙
鸿蒙hvigor构建任务依赖与生命周期简介
在构建的生命周期中Hvigor使用两个脚本文件来完成插件、任务以及生命周期hook的注册:
龙儿筝
2024/11/20
960
鸿蒙开发Hvigor插件动态生成代码
Hvigor允许开发者实现自己的插件,开发者可以定义自己的构建逻辑,并与他人共享。Hvigor主要提供了两种方式来实现插件:基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。
龙儿筝
2024/11/20
1040
使用 Flutter SDK 3.22.1构建HarmonyOS应用
1.进入项目根目录,如果项目还未创建,则使用 flutter create 命令创建项目
徐建国
2024/11/06
4930
使用 Flutter SDK 3.22.1构建HarmonyOS应用
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
参考鸿蒙Flutter实战:01-搭建开发环境文章的说明,首先安装 Flutter SDK 3.22.0。
少湖说
2024/11/03
6040
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
使用最新的 Flutter SDK 3.22.1 构建 HarmonyOS 应用
大家都知道目前鸿蒙的开源 tpc 和 sig 仓都迁移到了 gitcode 平台了,本次更新对 Flutter SDK 也有所涉及,所以我们就用最新的 Flutter SDK 来一起看一下如何构建 HarmonyOS 应用
徐建国
2025/04/11
5800
使用最新的 Flutter SDK 3.22.1 构建 HarmonyOS 应用
鸿蒙开发实战案例:自动生成动态路由
本示例将介绍如何使用装饰器和插件,自动生成动态路由表,并通过动态路由跳转到模块中的页面,以及如何使用动态import的方式加载模块。
小帅聊鸿蒙
2025/02/18
890
小白必看 HarmonyOS Next HMRouter 轻松上手秘籍
HMRouter 作为 HarmonyOS 的页面跳转场景解决方案,聚焦解决应用内原生页面的跳转逻辑。
万少
2025/02/08
1250
小白必看 HarmonyOS Next HMRouter 轻松上手秘籍
解锁 Flutter_exit_app 库鸿蒙适配:离一键退出鸿蒙应用仅一步之遥
在数字化浪潮的推动下,跨平台开发框架如 Flutter 凭借其高效、便捷的特性,成为了开发者们的宠儿。而鸿蒙系统的崛起,更是为跨平台开发注入了新的活力。为了助力开发者在鸿蒙生态中快速实现 flutter_exit_app 退出应用程序功能,本文将深入浅出地为大家解析如何适配 flutter_exit_app 三方库至鸿蒙平台。
徐建国
2025/04/30
930
解锁 Flutter_exit_app 库鸿蒙适配:离一键退出鸿蒙应用仅一步之遥
HarmonyOS 开发实践——基于自定义注解和代码生成实现路由框架
在应用开发中无论是出于工程组织效率还是开发体验的考虑,开发者都需要对项目进行模块间解耦,此时需要构建一套用于模块间组件跳转、数据通信的路由框架。
小帅聊鸿蒙
2024/11/11
1650
HarmonyOS 开发实践——基于自定义注解和代码生成实现路由框架
鸿蒙版 Flutter 三方库适配案例【screen_brightness】
项目是一个用于控制屏幕亮度的 Flutter 插件项目,支持 Android、iOS、macOS 和 Windows 平台。
徐建国
2025/03/12
1770
鸿蒙版 Flutter 三方库适配案例【screen_brightness】
接入鸿蒙 TheRouter
TheRouter 是货拉拉基于HMRouter深度定制的开源路由框架,提供了 Android、iOS、Harmony 三端高一致性使用,在支持平台化应用实现组件化、跨模块调用、动态化等功能的集成等功能基础上,支持动态路由下发、编译时安全检查、路由Path一对多等高度动态能力。
android技术分享
2025/04/16
940
用 Flutter 开发鸿蒙 PC 应用
本文为开发者提供了使用 Flutter 开发鸿蒙 PC 应用的全面指南。涵盖开发环境搭建、项目创建与配置、界面设计、业务逻辑开发以及调试测试等环节,同时强调适配鸿蒙 PC 界面规范和调用系统能力的方法。还分享了实用的注意事项、相关资源链接,帮助开发者高效地使用Flutter构建鸿蒙 PC 应用。
徐建国
2025/05/19
1970
用 Flutter 开发鸿蒙 PC 应用
Flutter 插件鸿蒙化,flutter_native_contact_picker 联系人选择器的跨平台适配实践
作者仓库:https://github.com/jayeshpansheriya/flutter_native_contact_picker
徐建国
2025/04/30
830
Flutter 插件鸿蒙化,flutter_native_contact_picker 联系人选择器的跨平台适配实践
推荐阅读
相关推荐
鸿蒙Flutter实战:07-混合开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验