


作者:VON 专栏:Flutter for OpenHarmony 参考前文:《Flutter 编译开发 OpenHarmony 全流程实战教程》
在上一篇文章中,我们手把手完成了基于 GitCode 社区项目(如 pocket_tool-v1.0.0)的 Flutter + OpenHarmony 混合项目构建,并成功在 DevEco Studio 中运行。很多读者反馈:“项目跑起来了,但有几个地方不太理解”,尤其是:
本文将围绕这两个核心疑点,深入剖析 Flutter 项目在 OpenHarmony 中的运行机制,并提供切实可行的解决方案。
这里的flutter项目可以参考我的上一篇文章
Flutter 编译开发 OpenHarmony 全流程实战教程(基于 GitCode 社区项目)
我这里用的是trae来跑的Flutter项目

这里构建好后直接运行即可

因为是口袋应用所以在网页端看要好一点

很多同学以为需要“迁移”或“重写”整个 Flutter 项目才能适配 OpenHarmony。其实不然!
gitcode_pocket_tool-v1.0.0.zip 并不是一个纯 Flutter Web 项目,而是一个预集成好的混合工程,其目录结构如下:
gitcode_pocket_tool/
├── flutter/ # Flutter 模块(Dart 代码)
├── ohos/ # OpenHarmony 原生模块(hvigor 配置、签名、权限等)
└── hvigorfile.ts # 构建入口当执行 flutter pub get 并在 DevEco Studio 中点击 ▶ Run 时,系统会:
flutter_hvigor_plugin 将 Flutter 模块编译为 OpenHarmony 可识别的 HAP 包;.hap 应用包,部署到模拟器或真机。
👉 因此,看到的“直接运行成功”,并非“自动迁移”,而是项目本身已按 OpenHarmony 规范封装好了!
🔍 建议:不要尝试将一个纯 Flutter Web 项目直接拖入 DevEco Studio 运行——它不会自动变成鸿蒙 App。必须使用社区提供的混合模板(如
flutter_flutter或pocket_tool)作为起点。
这是另一个高频问题。以 GitCode 口袋工具为例:
https://gitcode.com,点击搜索结果可正常跳转;
很多开发者第一反应是“是不是没开网络权限?”,于是添加了 ohos.permission.INTERNET:
// ohos/module.json5
{
"module": {
"reqPermissions": [
{ "name": "ohos.permission.INTERNET" }
]
}
}但即便如此,跳转依然无效。为什么?
出于安全考虑,OpenHarmony 不允许应用随意启动浏览器或跳转外部链接,除非显式声明并使用官方 API。
而 Flutter 中常用的 url_launcher 插件,在 OpenHarmony 环境下尚未完全适配,其底层调用的是 Android/iOS 的 Intent 或 UIApplication,在鸿蒙上无法生效。
要实现在鸿蒙 App 中打开外部网页,必须通过 OpenHarmony 的 @ohos.router 或 web_webview 能力,并通过 MethodChannel 从 Flutter 端调用。
在 ohos/src/main/ets/ 下创建或修改 MainAbilityStage.ts,添加 MethodChannel 处理逻辑:
// ohos/src/main/ets/MainAbilityStage.ts
import { AbilityStage, UIAbility } from '@ohos/app.ability';
import { BusinessError } from '@ohos/base';
export default class MainAbilityStage extends AbilityStage {
onAcceptWant(want) {
// ...
}
onCreate() {
// 注册 Flutter MethodChannel
const channel = new flutter.MethodChannel("openharmony/navigation");
channel.setMethodCallHandler((call) => {
if (call.method === "launchUrl") {
const url = call.args as string;
try {
// 使用 router 跳转到 Web 组件页面
this.context.startAbility({
bundleName: "com.example.pockettool",
abilityName: "EntryAbility",
parameters: { targetUrl: url }
});
return Promise.resolve(true);
} catch (err) {
return Promise.reject(err.message);
}
}
return Promise.reject("Method not implemented");
});
}
}// flutter/lib/main.dart
import 'package:flutter/services.dart';
final _channel = MethodChannel('openharmony/navigation');
void launchExternalUrl(String url) async {
try {
await _channel.invokeMethod('launchUrl', url);
} catch (e) {
print('Failed to launch URL: $e');
// 可降级为提示用户复制链接
}
}
// 使用示例
ElevatedButton(
onPressed: () => launchExternalUrl('https://gitcode.com/user/repo'),
child: Text('查看项目'),
)你也可以在鸿蒙端创建一个 WebPage.ets,使用 <web> 组件内嵌显示网页,避免跳出应用:
// ohos/src/main/resources/base/layout/web_page.xml.ets
@Entry
@Component
struct WebPage {
build() {
Column() {
Web({ src: router.getParams().targetUrl })
.width('100%')
.height('100%')
}
}
}问题 | 原因 | 解决方案 |
|---|---|---|
项目“直接运行”成功 | 项目本就是 OpenHarmony 混合工程 | 使用社区模板,勿直接导入纯 Flutter 项目 |
网页跳转无效 | url_launcher 不兼容鸿蒙 | 通过 MethodChannel 调用原生 startAbility 或内嵌 Web 组件 |
💡 重要提醒:目前 Flutter on OpenHarmony 仍是社区驱动方案,生态插件(如网络、跳转、存储)大多未官方适配。关键功能需通过原生桥接实现。
web_webview 组件在鸿蒙中的深度集成;openharmony_url_launcher 插件供社区复用;如果你也在踩坑 Flutter + OpenHarmony,欢迎留言交流!也别忘了收藏本系列教程,后续将持续更新 Electron、Qt 等框架在开源鸿蒙上的实战经验。
相关阅读: