【拥抱鸿蒙】Flutter+Cursor轻松打造HarmonyOS应用(一)
前言
在移动应用开发领域,Flutter以其出色的跨平台能力和高效的开发体验赢得了众多开发者的青睐,是许多移动开发者混合开发的首选。
随着HarmonyOS的崛起,许多开发者开始探索如何将Flutter应用迁移到鸿蒙生态。本文将带你从零开始,使用Flutter开发HarmonyOS应用,并借助强大的AI编程助手Cursor来加速UI开发过程。
这是“【拥抱鸿蒙】Flutter+Cursor轻松打造HarmonyOS应用”系列的第一篇。
一、环境准备:搭建Flutter for HarmonyOS开发环境
1.1 基础工具安装
首先确保你的开发机器已安装以下基础工具:
Flutter SDK(推荐3.13.0或更高版本)
# 下载Flutter SDK
git clone https://github.com/flutter/flutter.git -b stable # 添加环境变量
export PATH="$PATH:`pwd`/flutter/bin" # 运行flutter doctor检查依赖
flutter doctor
HarmonyOS开发工具:
API12, deveco-studio-5.0 或 command-line-tools-5.0 (推荐使用5.0.0 Release或更新版本)JDK17
配置环境变量
export TOOL_HOME=/Applications/DevEco-Studio.app/Contents # mac环境
export DEVECO_SDK_HOME=$TOOL_HOME/sdk # command-line-tools/sdk
export PATH=$TOOL_HOME/tools/ohpm/bin:$PATH # command-line-tools/ohpm/bin
export PATH=$TOOL_HOME/tools/hvigor/bin:$PATH # command-line-tools/hvigor/bin
export PATH=$TOOL_HOME/tools/node/bin:$PATH # command-line-tools/tool/node/bin
注意
这里有一个问题需要注意,支持鸿蒙的Flutter SDK版本目前是3.22.0版本。在开发适配iOS和Android时,我们使用的Flutter版本可能高于3.22.0。这时,因此需要使用fvm对Flutter版本进行管理,可以同时维护和切换多个Flutter版本。同时也建议,Flutter的鸿蒙应用仓库最好和其他端仓库分开,因为目前支持鸿蒙的Flutter版本是滞后于Flutter官方版本的。
使用fvm维护多个版本示例:

1.2 配置Flutter鸿蒙支持
目前Flutter对HarmonyOS的支持主要通过开源项目OpenHarmony-TPC/flutter_flutter实现。
该仓库是基于Flutter官方仓库的3.22.0版本,对于OpenHarmony平台的兼容拓展。可支持IDE或者终端使用Flutter Tools指令编译和构建OpenHarmony应用程序。
Build前需使用fvm切换Flutter版本:
fvm use custom_3.22.0
1.3 环境验证
创建新项目并检查鸿蒙支持:
flutter create my_harmony_app
cd my_harmony_app
flutter run -d harmony
如果看到鸿蒙模拟器或真机上运行着Flutter的默认启动页面,说明环境配置成功!
二、Flutter鸿蒙开发框架解析
2.1 架构概览
Flutter在HarmonyOS上的运行架构分为三层:
- 框架层:Dart实现的Flutter框架
- 引擎层:Skia渲染引擎+鸿蒙适配层
- 系统层:HarmonyOS的ACE(Ability Cross-platform Environment)
2.2 关键差异点
与Android/iOS平台相比,Flutter在鸿蒙上需要注意:
- 页面导航:使用HarmonyOS的Page Ability而非Activity/ViewController
- 权限系统:鸿蒙特有的权限声明方式
- 原生交互:通过
ffi与鸿蒙的Native API通信
2.3 常用适配组件
import 'package:flutter_harmony/harmony.dart';
// 鸿蒙特色的组件
HarmonyApp(
config: HarmonyConfig(
abilityName: 'MainAbility', // 对应的鸿蒙Ability名称
),
home: MyHomePage(),
);
三、Flutter与鸿蒙原生交互
3.1 导入原生插件
与其他端类似,ohos工程中需要GeneratedPluginRegistrant.ets文件导入Flutter生成的原生插件。
3.2 实现FlutterPlugin
定义一个类作为FlutterPlugin的实现,并在onAttachedToEngine(binding: FlutterPluginBinding): void 方法中使用MethodChannel监听Flutter调用的方法。
export default class HMFlutterPlugin implements FlutterPlugin {
private channel?: MethodChannel;
private basicChannel?: BasicMessageChannel<Any>;
private context?: common.UIAbilityContext;
setContext(context: common.UIAbilityContext) {
this.context = context;
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(), "com.xxx.app/message");
this.channel.setMethodCallHandler({
onMethodCall: (call: MethodCall, result: MethodResult) => {
if (!this.context) {
result.error("CONTEXT_NOT_INITIALIZED", "Context is not initialized", null);
}
const argsRec = call.args as Map<string, Object>;
LogUtil.info(`[flutter-call-ohos]\nmethod: ${call.method}\nargs: ${JSONUtil.toJSONString(argsRec)}`);
switch (call.method) {
case "xxx": {
break;
}
default: break;
}
}
3.3 配置FlutterEngine
在EntryAbility.ets中实现configureFlutterEngine(flutterEngine: FlutterEngine) 方法。
configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
GeneratedPluginRegistrant.registerWith(flutterEngine)
const plugin = new HMFlutterPlugin();
plugin.setContext(this.context);
this.addPlugin(plugin);
}
3.4 回调返回给Flutter端
使用result.success(res);回调执行成功的数据;使用result.error(errorCode, error.message, null);回调执行失败的错误信息。
try {
// xxx接口功能实现
result.success(res);
} catch (err) {
let error = err as BusinessError;
result.error(errorCode, error.message, null);
}
3.5 Flutter调用鸿蒙原生方法并接收回调数据
try {
final res = await _channel.invokeMethod('method_ohos');
return res.toString().toLowerCase() == 'true' || res.toString() == '1';
} catch (e) {
printError('get network status error: $e');
}
总结
本篇主要介绍了Flutter开发鸿蒙应用的环境搭建和交互,我们将在下篇介绍如何借助Cursor提高开发效率让我们的开发之旅轻松而有趣。
我是郑知鱼,欢迎大家讨论与指教。
如果你觉得有所收获,也请点赞收藏️关注我吧~~
【拥抱鸿蒙】Flutter+Cursor轻松打造HarmonyOS应用(一)的更多相关文章
- 用WPF轻松打造iTunes CoverFlow效果
原文:用WPF轻松打造iTunes CoverFlow效果 用WPF轻松打造iTunes CoverFlow效果 ...
- 【Microsoft Azure 的1024种玩法】八. 基于Azure云端轻松打造一款好用的私有云笔记
[简介] Leanote一款开源云笔记软件,它使用Go的Web框架revel和MongoDB开发完成的,其是目前为止发现的最有bigger的云笔记,它支持markdown输入,代码高亮,多人协作,笔记 ...
- iOS教你轻松打造瀑布流Layout
前言 : 在写这篇文章之前, 先祝贺自己, 属于我的GitHub终于来了. 这也是我的GitHub的第一份代码, 以下文章的代码均可以在Demo clone或下载. 欢迎大家给予意见. 觉得写得不错的 ...
- 用mongols轻松打造websocket应用
用websocket做聊天系统是非常合适的. mongols是一个运行于linux系统之上的开源c++库,可轻松开启一个websocket服务器. 首先,build一个websocket服务器. #i ...
- 【腾讯云的1001种玩法】 Laravel 整合微视频上传管理能力,轻松打造视频App后台
版权声明:本文由白宦成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108597001488193402 来源:腾云阁 h ...
- 完全用nosql轻松打造千万级数据量的微博系统(转)
原文:http://www.cnblogs.com/imxiu/p/3505213.html 其实微博是一个结构相对简单,但数据量却是很庞大的一种产品.标题所说的是千万级数据量 也并不是一千万条微博信 ...
- 完全用nosql轻松打造千万级数据量的微博系统
其实微博是一个结构相对简单,但数据量却是很庞大的一种产品.标题所说的是千万级数据量也并不是一千万条微博信息而已,而是千万级订阅关系之间发布.在看 我这篇文章之前,大多数人都看过sina的杨卫华大牛的微 ...
- 【PS实例】轻松打造梦幻的照片
本系列教程将开始讲解PS的一些制作实例,通过实例的讲解同时介绍各种工具和面板机快捷键的使用,这样能够让大家更有兴趣学习,在学习的同时能够创造出自己喜欢的东西.本人使用的教程都是根据本人多次调试制作,仅 ...
- 用 Flutter 和 Firebase 轻松构建 Web 应用
作者 / Very Good Ventures Team 我们 (Very Good Ventures 团队) 与 Google 合作,在今年的 Google I/O 大会上推出了 照相亭互动体验 ( ...
- Flutter 1.0 正式版: Google 的便携 UI 工具包
Flutter 1.0 正式版: Google 的便携 UI 工具包 文 / Tim Sneath,Google Dart & Flutter 产品组产品经理 Flutter 是 Google ...
随机推荐
- excel 数字转中文大写金额
1.在单元格中输入公式: =SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1,2),TEXT(A1,";负")&TEXT(INT(ABS(A1)+0.5%) ...
- mysql 查询结果为空时值时执行后面的sql语句
sql server支持变量所以一般使用方法如下: DECLARE @Val varchar(50) select @Val = param_value where t_param where par ...
- xxe学习笔记
什么是xxe XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的.例如PHP中的simp ...
- 附035.Kubernetes_v1.25.3高可用部署架构二
目录 部署组件 kubeadm介绍 kubelet介绍 kubectl介绍 方案概述 方案介绍 部署规划 节点规划 主机名配置 变量准备 互信配置 环境初始化 部署高可用组件 HAProxy安装 Ke ...
- QSound、QSoundEffect播放WAV音频
QSound.QSoundEffect播放WAV音频 本文旨在介绍QSound.QSoundEffect的简单播放音频的方法以及对这两个类的一些基本介绍 文章目录 QSound.QSoundEffec ...
- 5个步骤完成 Vue3 开发调试工具安装教程
Vue3 开发调试工具安装教程 5个步骤 第一步:点击浏览器右上角,更多工具 – 扩展程序 第二步:点击右上角 – 开发者模式 开关 第三步:点击 "添加已解压的扩展程序" 第四步 ...
- DeepSeek+Claude强强联手,使用AI驱动DjangoStarter 3.1框架升级
前言 上个月底培训了一周就没时间更新博客 上周有一些空闲时间,就继续体验最近很火的AI辅助编程 之前的文章中有说到我配置好了 VSCode + Cline 插件搭配本地部署的 DeepSeek 来实现 ...
- docker报错 ERROR: Service 'workspace' failed to build: ERROR: Service 'php-fpm' failed to build:
在 Windows 系统中使用 Laradock 搭建基于 Docker 的 PHP 开发环境 执行命令 docker-compose up nginx mysql redis 执行过程中出现错误 报 ...
- 神经网络与模式识别课程报告-卷积神经网络(CNN)算法的应用
======================================================================================= 完整的神经网络与模式识别 ...
- Linux 下如何修改密码有效期?
有时我们连接远程服务器的时候,提示密码过期,需要修改密码才能登录,这时可以用chage命令来调整下用户密码的有效期,使用户可以继续使用. chage命令 chage命令用于查看以及修改用户密码的有效期 ...