【拥抱鸿蒙】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 ...
随机推荐
- 『Python底层原理』--Python字符串的秘密
在现代编程中,字符串是不可或缺的数据类型. 无论是处理用户输入.文件读写还是网络通信,字符串都扮演着核心角色. 然而,字符串的处理并非简单地将字符拼接在一起,它涉及到字符集.编码以及编程语言的底层实现 ...
- pnpm : 无法加载文件 \AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。
1. 安装pnpm npm install -g pnpm #安装 pnpm pnpm --version #查看pnpm版本 安装完成后查看版本时报错 pnpm : 无法加载文件 C:\Users\ ...
- SpringBoot项目war、jar自定义配置application文件的位置
此篇文章的真正目的应该是关于war包运行在独立tomcat下时,应如何在war包外部配置application.properties,以达到每次更新war包而不用更新配置文件的目的.百度搜素Sprin ...
- csharp入门经典
C#简介 .NET Framework是Microsoft为开发应用程序而创建的一个具有革命意义的平台,它有运行在其他操作系统上的版本 .NET Framework的设计方式确保它可以用于各种语言,包 ...
- php获取详细访客信息,获取访客IP,IP归属地,访问时间,操作系统,浏览器,移动端/PC端,环境语言,访问URL等信息
问题描述:需要获取访客访问网站信息 1.代码示例与说明: <?php header("Content-Type: text/html; charset=utf-8"); ...
- 【ABAQUS&Composite】composite layerup Manager从txt导入铺层信息
ABAQUS 在复合材料建模方面自由度是比较高的.官方提供了两个工具: ABAQUS/CAE中的Composite Layup Manager ABAQUS/CAE的plugin:Composites ...
- Golang数组去重&切片去重
合并两个整型切片,返回没有重复元素的切片,有两种去重策略 1. 通过双重循环来过滤重复元素(时间换空间) // 通过两重循环过滤重复元素 func RemoveRepByLoop(slc []int) ...
- halcon 入门教程(二)Blob分析(二值化,联通区域,分割区域,提取区域)保姆级教程
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18781187 有兴趣可以多看其他的halcon教程 halcon 学习教程目录 OK,今天讲h ...
- windows 稀疏文件 (sparse file) 的一个实用场景——解决 SetEndOfFile 占据磁盘空间引入的性能问题
前言 之前写过一篇文章说明文件空洞:<[apue] 文件中的空洞>,其中提到了 windows 稀疏文件是制造空洞的一种方式,但似乎没什么用处,如果仅仅处理占用磁盘空间的场景,使用SetE ...
- Mavros & Mavlink
博客地址:https://www.cnblogs.com/zylyehuo/ 参考 https://www.bilibili.com/video/BV1x841167uG?spm_id_from=33 ...