Flutter 以模塊化方案 適配 HarmonyOS 的實現方法

Flutter 以模塊化方案 適配 HarmonyOS 的實現方法

Flutter的SDK: https://gitcode.com/openharmony-tpc/flutter_flutter
分支Tag:3.27.5-ohos-0.1.0-beta
DevecoStudio:DevEco Studio 5.1.1 Release
HarmonyOS版本:API18

本文使用的Mac,環境配置步驟不再贅述,參考社區文檔!!!

Flutter 應用可以通過與 HarmonyOS 原生代碼交互來適配 HarmonyOS 平臺。主要涉及 Flutter 端的插件開發和 HarmonyOS 端的原生能力實現。

Flutter 側代碼實現

在 Flutter 中,通過 MethodChannel 與 HarmonyOS 原生代碼通信。以下是一個示例:

main.dart

void main() => runApp(GetMaterialApp(// home: const HomePage(),title: "Flutter側",getPages: [GetPage(name: "/home", page: () => const HomePage()),GetPage(name: "/first", page: () => const FirstPage()), //空頁面],));

home_page.dart

class HomePage extends StatefulWidget {const HomePage({super.key});State<HomePage> createState() {return _HomePageState();}
}class _HomePageState extends State<HomePage> {String deviceTypeName = "";String receiveData = "xxxxxx";void initState() {super.initState();Get.parameters.forEach((key, value) {if (key == "receiveData") {setState(() {receiveData = value!;});}});}Widget build(BuildContext context) {deviceTypeName = Platform.operatingSystem;return Scaffold(appBar: AppBar(title: const Text('適配Android/iOS/HarmonyOS',style: TextStyle(fontSize: 20),),),body: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text(deviceTypeName,style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold),),const SizedBox(width: double.infinity,height: 20,),Text('接收來自原生的數據:$receiveData'),const SizedBox(width: double.infinity,height: 20,),GestureDetector(onTap: () {ToastUtil.showToastCenter("Send Native");NativeChannel.sendData();},child: Container(width: 120,height: 40,alignment: Alignment.center,decoration: BoxDecoration(color: const Color(0xff08b326),borderRadius: BorderRadius.circular(10)),child: const Text("Send Native",style: TextStyle(color: Colors.white),),),),GestureDetector(onTap: () {ToastUtil.showToastCenter("Finish Page");NativeChannel.finishPage();},child: Container(width: 120,height: 40,margin: const EdgeInsets.only(top: 10),alignment: Alignment.center,decoration: BoxDecoration(color: const Color(0xff08b326),borderRadius: BorderRadius.circular(10)),child: const Text("Finish Page",style: TextStyle(color: Colors.white),),),)],),);}
}

native_channel.dart

class NativeChannel {//創建通道static const _channel = MethodChannel('com.flutter/native_channel');///調用原生方法,關閉原生頁面static Future<void> finishPage() async {await _channel.invokeMethod('finishPage');}///調用原生方法,發送flutter數據static Future<void> sendData() async {await _channel.invokeMethod('sendData', {'data': '我是FLutter傳到原生客戶端的數據'});}
}
HarmonyOS 側代碼實現

在 HarmonyOS 中,需要實現 Ability 來處理 Flutter 的調用。

  1. 創建項目默認創建 EntryAbility
    EntryAbility 類中初始化Flutter管理部分:
export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);FlutterManager.getInstance().pushUIAbility(this)}onDestroy(): void {FlutterManager.getInstance().popUIAbility(this)}onWindowStageCreate(windowStage: window.WindowStage): void {hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');FlutterManager.getInstance().pushWindowStage(this, windowStage);windowStage.loadContent('pages/Index', (err) => {if (err.code) {hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));return;}hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');let windowClass: window.Window = windowStage.getMainWindowSync(); // 獲取應用主窗口// 1. 設置窗口全屏windowClass.setWindowLayoutFullScreen(true)// 2. 設置狀態欄和導航條隱藏windowClass.setSpecificSystemBarEnabled('status', true)let sysBarProps: window.SystemBarProperties = {statusBarContentColor: '#000000'  //全局設置狀態欄文字顏色};windowClass.setWindowSystemBarProperties(sysBarProps);});}onWindowStageDestroy(): void {FlutterManager.getInstance().popWindowStage(this);}onForeground(): void {}onBackground(): void {}
}
  1. 實現FlutterPage頁面 負責承載FLutter模塊的Harmony頁面
@Entry
@Component
struct FlutterViewPage {private flutterEntry?: FlutterEntry | null = null;private flutterView?: FlutterView;aboutToAppear() {//跳轉至指定路由 ?后面為參數let params: Record<string, Object> = {"route": "/home?receiveData=HarmonyOS已經誕生5年了"}this.flutterEntry = new FlutterHomeAbility(getContext(this) as common.UIAbilityContext, params);this.flutterEntry.aboutToAppear();this.flutterView = this.flutterEntry.getFlutterView();this.flutterEntry.addPlugin(new HomePlugin(this.getUIContext()));}aboutToDisappear() {this.flutterEntry?.aboutToDisappear();}onPageShow() {this.flutterEntry?.onPageShow();}onPageHide() {this.flutterEntry?.onPageHide();}build() {RelativeContainer() {FlutterPage({ viewId: this.flutterView?.getId() }).width('100%').height('100%')}}
}class HomePlugin implements FlutterPlugin {private channel?: MethodChannel;	//交互通道private cxt?: UIContextconstructor(context: UIContext) {this.cxt = context}getUniqueClassName(): string {return HomePlugin.name;}//交互過程onAttachedToEngine(binding: FlutterPluginBinding): void {this.channel = new MethodChannel(binding.getBinaryMessenger(), "com.flutter/native_channel");let context = this.cxtthis.channel.setMethodCallHandler({onMethodCall(call: MethodCall, result: MethodResult) {switch (call.method) {case "finishPage":ToastUtil.showToast("頁面關閉");context?.getRouter().back()break;case "sendData":ToastUtil.showToast("發送flutter數據:" + call.argument("data"));break;default:result.notImplemented();break;}}})}onDetachedFromEngine(binding: FlutterPluginBinding): void {this.channel?.setMethodCallHandler(null)}
}
  1. 實現Flutter引擎
export default class FlutterHomeAbility extends FlutterEntry {configureFlutterEngine(flutterEngine: FlutterEngine): void {super.configureFlutterEngine(flutterEngine);GeneratedPluginRegistrant.registerWith(flutterEngine);}
}
交互過程
  1. Flutter 調用 HarmonyOS 方法

    • Flutter 通過 MethodChannel 調用 finishPage 方法。
    • HarmonyOS 收到請求后處理信息。
  2. Flutter 向 HarmonyOS 傳遞參數

    • Flutter 調用 sendData 方法并傳遞 data 參數。
    • HarmonyOS 解析參數并顯示 Toast。
  3. 通信流程

    • Flutter 發送方法名和參數到 HarmonyOS。
    • HarmonyOS 根據方法名執行對應邏輯并返回結果。
注意事項
  • 插件打包
    將 Flutter 代碼打包為 Harmony可用的 har 插件,方便調用。
    Flutter打包 har 命令:
flutter build har --release
//構建結果在 項目根目錄/build/ohos/har/release
  • 性能優化
    頻繁通信建議使用 EventChannel 替代 MethodChannel 以減少開銷。

  • HarmonyOS側導入har
    1、項目根目錄下oh-package.json5文件

{"modelVersion": "5.1.1","description": "Please describe the basic information.","dependencies": {},"overrides": {//導入har包"@ohos/flutter_ohos": "file:../../FlutterProject/mobile_flutter_ohos/build/ohos/har/release/flutter_embedding_release.har","flutter_native_arm64_v8a": "file:../../FlutterProject/mobile_flutter_ohos/build/ohos/har/release/arm64_v8a_release.har","@ohos/flutter_module": "file:../../FlutterProject/mobile_flutter_ohos/build/ohos/har/release/flutter_module.har"},"devDependencies": {"@ohos/hypium": "1.0.21","@ohos/hamock": "1.0.0"}
}

2、模塊entry根目錄下oh-package.json5文件

{"name": "entry","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {//新增"@ohos/flutter_ohos": "file:../../../FlutterProject/mobile_flutter_ohos/build/ohos/har/release/flutter_embedding_release.har","flutter_native_arm64_v8a": "file:../../../FlutterProject/mobile_flutter_ohos/build/ohos/har/release/arm64_v8a_release.har","@ohos/flutter_module": "file:../../../FlutterProject/mobile_flutter_ohos/build/ohos/har/release/flutter_module.har"}
}

通過以上方法,Flutter 應用可以無縫適配 HarmonyOS,并調用原生功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93423.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis入門與背景詳解:構建高并發、高可用系統的關鍵基石

本文前言認識Redis單機架構淺談分布式系統分布式是什么數據庫分離和負載均衡引入緩存數據庫分庫分表引入微服務念補充小結Redis特性介紹持久化支持集群高可用快Redis的應用場景總結前言 在當今這個數據驅動的時代&#xff0c;應用的性能和可擴展性已成為衡量其成功的關鍵指標。…

Mysql常見的優化方法

數據庫優化(底層基礎優化) 數據庫層面的優化是性能“基礎"&#xff0c; 主要包含架構設計、存儲引擎、表結構、索引策略、配置參數等方面考慮。目標是減少資源(CPU、IO和內存)消耗。 架構設計 讀寫分離&#xff1a;將"讀操作"和"寫操作"分離到不同的數…

利用Claude Code打造多語言網站內容翻譯工具:出海應用開發全流程實戰教程

一、工具選型與準備Claude Code 簡介 Claude Code 是 Anthropic 公司推出的 AI 編程助手&#xff0c;可以輔助開發者生成代碼、優化代碼結構、進行代碼解釋等&#xff0c;支持多種主流編程語言。開發環境準備 Claude Code 賬號或 API 接入權限Node.js 或 Python 環境&#xff0…

集成運算放大器(反向比例,同相比例)

基礎知識&#xff1a;反相比例運算原理&#xff1a;示波器顯示&#xff1a;結論&#xff1a;放大倍數為-R2/R1。R3的大小約等于R1與R2的并聯電阻。由于放大器的最大輸出電壓取決于供電電壓&#xff0c;所以如果R2為7k時&#xff0c;會導致失真。同向比例原理&#xff1a;示波器…

【HBase】HBaseJMX 接口監控信息實現釘釘告警

目錄 一、JMX 簡介 二、JMX監控信息釘釘告警實現 一、JMX 簡介 官網&#xff1a;Apache HBase ? Reference Guide JMX &#xff08;Java管理擴展&#xff09;提供了內置的工具&#xff0c;使您能夠監視和管理Java VM。要啟用遠程系統的監視和管理&#xff0c;需要在啟動Java…

SQL 語言規范與基礎操作指南

SQL 語言規范與基礎操作指南 SQL 作為數據庫操作的核心語言&#xff0c;遵循規范的語法和書寫習慣不僅能提高代碼可讀性&#xff0c;還能減少錯誤。本文整理了 SQL 的基礎規則、書寫規范及常用操作&#xff0c;適合初學者快速上手。 一、SQL 基本規則 1. 書寫格式 SQL 語句可寫…

產業園IBMS智能化集成系統功能有哪些?

產業園 IBMS&#xff08;建筑集成管理系統&#xff09;智能化集成系統是針對產業園 “多業態、多系統、多租戶” 特點設計的全局管理平臺&#xff0c;通過整合樓宇自控、安防、消防、能源、停車、租戶服務等子系統&#xff0c;實現 “集中監控、協同聯動、數據驅動、靈活服務”…

線性代數之兩個宇宙文明關于距離的對話

矢量的客觀性和主觀性宇宙中飄過來一個自由矢量&#xff0c;全世界的人都可以看到&#xff0c;大家都在想&#xff0c;怎么描述它呢&#xff0c;總不能指著它說“那個矢量”吧。數學家很聰明&#xff0c;于是建立了一個坐標系&#xff0c;這個矢量投影到坐標系下&#xff0c;就…

Camx-Tuning參數加載流程分析

調用時序圖 一、效果參數在開機時加載 CreateTuningDataManager邏輯分析 1.從xxx_module.xml獲取sensor名稱和效果參數名稱&#xff0c; 比如效果參數名稱為&#xff1a;xtc_tsp_sc520cs那么效果庫的完整名稱就是&#xff1a;com.qti.tuned.xtc_tsp_sc520cs.bin 2.優先從/data/…

《P4180 [BJWC2010] 嚴格次小生成樹》

題目描述小 C 最近學了很多最小生成樹的算法&#xff0c;Prim 算法、Kruskal 算法、消圈算法等等。正當小 C 洋洋得意之時&#xff0c;小 P 又來潑小 C 冷水了。小 P 說&#xff0c;讓小 C 求出一個無向圖的次小生成樹&#xff0c;而且這個次小生成樹還得是嚴格次小的&#xff…

Transformer淺說

rag系列文章目錄 文章目錄rag系列文章目錄前言一、簡介二、注意力機制三、架構優勢四、模型加速總結前言 近兩年大模型爆火&#xff0c;大模型的背后是transformer架構&#xff0c;transformer成為家喻戶曉的詞&#xff0c;人人都知道它&#xff0c;但是想要詳細講清楚&#x…

后臺管理系統-3-vue3之左側菜單欄和頭部導航欄的靜態搭建

文章目錄1 CommonAside組件(靜態搭建)1.1 Menu菜單1.2 準備菜單數據1.3 循環渲染菜單1.3.1 el-menu結構1.3.2 動態渲染圖標1.4 樣式設計1.5 整體代碼(CommonAside.vue)2 CommonHeader組件(靜態搭建)2.1 準備圖片URL數據2.2 頁面布局2.3 樣式設計2.4 整體代碼(CommonHeader.vue)…

VS Code配置MinGW64編譯非線性優化庫NLopt

VS Code用MinGW64編譯C代碼安裝MSYS2軟件并配置非線性優化庫NLopt和測試引用庫代碼的完整具體步驟。 1. 安裝MSYS2 下載安裝程序&#xff1a; 訪問 MSYS2官網下載 msys2-x86_64-xxxx.exe 并運行 完成安裝&#xff1a; 默認安裝路徑&#xff1a;C:\msys64安裝完成后&#xff0c…

C#通過TCP_IP與PLC通信

C#通過TCP/IP與PLC通信 本文將全面介紹如何使用C#通過TCP/IP協議與各種PLC進行通信&#xff0c;包括西門子、羅克韋爾、三菱等主流品牌PLC的連接方法。 一、PLC通信基礎 PLC通信協議概覽協議類型適用品牌特點Modbus TCP通用協議簡單易用&#xff0c;廣泛支持Siemens S7西門子PL…

Java 學習筆記(基礎篇3)

1. 數組&#xff1a;① 靜態初始化&#xff1a;(1) 格式&#xff1a;int[] arr {1, 2, 3};② 遍歷/* 格式&#xff1a; 數組名.length */ for(int i 0; i < arr.length; i){//在循環的過程中&#xff0c;i依次表示數組中的每一個索引sout(arr[i]);//就可以把數組里面的每一…

知識點匯總linuxC高級-3 shell腳本編程

shell腳本編程shell ---> 解析器&#xff1a;sh csh ksh bashshell命令 ---> shell解析的命令shell腳本 --> shell命令的有序集合shell腳本編程&#xff1a;將shell命令結合按照一定邏輯集合到一起&#xff0c;寫到一個 .sh 文件&#xff0c;去實現一個或多個功能&…

【C++學習篇】:基礎

文章目錄前言1. main() 函數2. 變量賦值3. cin和cout的一些細節4. 基本類型運算5. 內存占用6. 引用7. 常量前言 C 語法的學習整理&#xff0c;作為個人總結使用。 1. main() 函數 #include <iostream> //使用輸入輸出流庫&#xff08;cin&#xff0c;cout&#xff09;…

使用nginx反向代理kkfile

這篇說一下我解決的思路和方式哈&#xff0c;不一定適用于大家&#xff0c;可以做個參考比如我們的系統服務是http://10.63.25.35:80&#xff0c;而我們的文件服務是在10.63.25.37:8012上&#xff0c;正常不使用代理的話&#xff0c;我們前端調用后端接口&#xff0c;后端調用k…

【低成本擴容】動態擴容實戰指南

面對擴容操作時&#xff0c;下面這種操作是否也會迷惑你&#xff1f;下面來為大家解惑~size_t newcapacity 2*_capacity > (_size len)?2*_capacity:(_sizelen); //len為即將插入的字符串有效字符個數//_size為當前字符串有效字符個數//_capacity為當前容量大小//newcapa…

Product Hunt 每日熱榜 | 2025-08-14

1. Autumn 標語&#xff1a;為AI初創公司簡化的Stripe服務 介紹&#xff1a;Autumn幫助AI初創公司通過只需三個API調用來定價、計量和控制使用情況。基于Stripe搭建&#xff0c;它可以在一個地方管理訂閱、使用情況和訪問權限。無需復雜的webhooks或后端邏輯&#xff0c;非常…