Channel實現Flutter與原生平臺之間的雙向通信

文章目錄

  • (一)通過MessageChannel實現Flutter與原生平臺之間的雙向通信
    • Flutter端實現MessageChannel通信步驟:
    • Android端實現MessageChannel通信步驟:
  • (二)通過MethodChannel實現Flutter與原生平臺之間的雙向通信
    • Flutter端實現MessageChannel通信步驟:
    • Android端實現MessageChannel通信步驟:
  • (三)通過EventChannel實現Flutter與原生平臺之間的雙向通信
    • Flutter端實現EventChannel通信步驟:
    • Android端實現EventChannel通信步驟:

首先,現在Android中進行注冊與初始化:

    private void registerChannelFunction() {FlutterEngine flutterEngine = getFlutterEngine();if (flutterEngine == null) {Log.e("ERROR", "注冊消息通道失敗 FlutterEngine = null");return;}DartExecutor dartExecutor = flutterEngine.getDartExecutor();binaryMessenger = dartExecutor.getBinaryMessenger();messageChannelSendFunction();methodChannelSendFunction();eventChannelSendFunction();}

(一)通過MessageChannel實現Flutter與原生平臺之間的雙向通信

Flutter端實現MessageChannel通信步驟:

先定義messageChannel

static const basicMethodChannel = 
BasicMessageChannel("flutter_basic_method_channel", StandardMessageCodec());

發送message:

  Future<void> sendMessage(Map json) async {await basicMethodChannel.send(json);}

接收message:

  void receiveMessage() {basicMethodChannel.setMessageHandler((result) async {Map? map = result as Map?;int code = map?["code"];String message=map?["message"];setState(() {receive = "messageChannel receiveMessage 中的回調 code $code  message $message";print(receive);print("receiveMessage: code:$code message:$message");});return 'Flutter 已收到消息';});}

Android端實現MessageChannel通信步驟:

首先,先初始化 BasicMessageChannel 實例對象:

basicMessageChannel = new BasicMessageChannel<>(binaryMessenger, 
"flutter_basic_method_channel", StandardMessageCodec.INSTANCE);

然后為Message對象設置MessageHandler對象:

        basicMessageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler() {@Overridepublic void onMessage(@Nullable Object message, @NonNull BasicMessageChannel.Reply reply) {System.out.println("flutter 傳來的數據為: "+message.toString());basicSendMessage();}});

(二)通過MethodChannel實現Flutter與原生平臺之間的雙向通信

Flutter端實現MessageChannel通信步驟:

定義methodChannel:

static const methodChannel = MethodChannel("flutter_method_channel");

然后通過methodChannel的invokeMethod進行消息的發送:

  static Future<dynamic> invokeNative(String method,{required Map<String, String> arguments}) async {if (arguments == null) {return await methodChannel.invokeMethod(method);} else {return await methodChannel.invokeMethod(method, arguments);}}

最后調用會返回一個結果,通過這個result拿到返回的數據:

    Map result = await invokeNative("test", arguments: {});int code = result["code"];String message = result["message"];setState(() {receive = "invokeNative 中的回調 code $code message $message";print(receive);});

Android端實現MessageChannel通信步驟:

先初始化MethodChannel的實例:

        mMethodChannel = new MethodChannel(binaryMessenger, channelName);

然后設置methodHandler,它會重寫MethodCallHandler的onMethodCall方法:

    private MethodChannel.MethodCallHandler getMethodCallHandler() {return new MethodChannel.MethodCallHandler() {@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {String method = call.method;Object Arguments = call.arguments;Map<String, Object> arguments = null;if (null != Arguments) {arguments = (Map<String, Object>) Arguments;}if ("test".equals(method)) {Toast.makeText(this, "flutter 調用到了 android test 數據為 name :"+arguments.get("name") +" age : "+arguments.get("age"), Toast.LENGTH_SHORT).show();Map<String, Object> objectMap = new HashMap<>();objectMap.put("message", "result.success 返回給flutter的basic數據");objectMap.put("code", 300);result.success(objectMap);} else {result.notImplemented();}}};}

(三)通過EventChannel實現Flutter與原生平臺之間的雙向通信

Flutter端實現EventChannel通信步驟:

首先 初始化EventChannel實例:

static const eventChannel = EventChannel("flutter_event_channel");

然后設置Stream:

    eventChannel.receiveBroadcastStream().listen((event) {// int code = event["code"];// String message = event["message"];setState(() {// receive += "code $code message $message  ";// print("eventMessageListener: "+receive);print(event);});}, onError: (event) {});

Android端實現EventChannel通信步驟:

初始化EventChannel:

String channelName = "flutter_event_channel";
EventChannel eventChannel = new EventChannel(binaryMessenger, channelName);

然后調用setStreamHandler為EventChannel設置一個處理器:

        eventChannel.setStreamHandler(new EventChannel.StreamHandler() {@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {eventSink = events;startTimer();}@Overridepublic void onCancel(Object arguments) {}});

EventSink 接口中 , 有 3 個方法 :

  • success : 表示接收數據成功 ;
  • error : 表示接收數據出現錯誤 ;
  • endOfStream : 表示接收數據結束 ;

這樣就完成了Flutter與Android原生之間的通信,IOS的不太熟,有需要可以搜一下,都大差不差,如果覺得博主寫的對你有幫助,麻煩給個一鍵三連

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

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

相關文章

uniapp/微信小程序實現加入購物車點擊添加飛到購物車動畫

1、預期效果 2、實現思路 每次點擊添加按鈕時&#xff0c;往該按鈕上方添加一個懸浮元素&#xff0c;通過位移動畫將元素移到目標位置。 1. 為每個點擊元素設置不同的class&#xff0c;才能通過uni.createSelectorQuery來獲取每個元素的節點信息&#xff1b; 2. 添加一個與…

c++:(map和set的底層簡單版本,紅黑樹和AVL樹的基礎) 二叉搜索樹(BST)底層和模擬實現

文章目錄 二叉搜索樹的概念二叉搜索樹的操作二叉搜索樹的查找find 二叉搜索樹的模擬實現構造節點insertfinderase(細節巨多,面試可能會考)a.葉子節點b.有一個孩子左孩子右孩子 c.有兩個孩子注意: erase代碼 中序遍歷 二叉搜索樹的應用k模型k模型模擬實現的總代碼 k-value模型k-…

7-Zip命令行調用命令收集(20個)

列出壓縮文件的內容: 7z l archive.7z 解壓壓縮文件到當前目錄: 7z x archive.7z 解壓壓縮文件到指定目錄: 7z x archive.7z -o"C:\path\to\extract" 創建新的壓縮文件 (添加到archive.7z): 7z a archive.7z file_to_compress 創建包含多個文件的壓縮文件: 7z a arc…

【JVM】了解JVM規范中的虛擬機結構

目錄 JVM規范的主要內容 1&#xff09;字節碼指令集(相當于中央處理器CPU) JVM指令分類 2&#xff09;Class文件的格式 3&#xff09;數據類型和值 4&#xff09;運行時數據區 5&#xff09;棧幀 6&#xff09;特殊方法 7&#xff09;類庫 JVM規范的主要內容 1&#…

Vue3+ElementPlus+TS開發業務功能的問題匯總(持續更新)

1.開發表單彈框功能時遇到兩個問題&#xff1a;加入了校驗規則后&#xff0c;無論下拉框是否選擇數據下面的紅色提示都會觸發顯示不會自動隱藏 &#xff1b; 另外&#xff0c;新增的功能在提交后數據無法重置&#xff0c;這種在修改時可能會出現&#xff0c;但新增正常情況是不…

走進C++:C到C++的過渡

目錄 什么是C呢&#xff1f; C的發展史 多了一些吃前來很香的“語法糖”。 語法糖一&#xff1a;命名空間 命名空間有個強大的功能 如何使用 語法糖二&#xff1a;缺省參數 語法糖三&#xff1a;函數重載 語法糖四&#xff1a;引用 引用傳參 引用返回 引用和…

【ZZULIOJ】1100: 求組合數(函數專題)(Java)

目錄 題目描述 輸入 輸出 樣例輸入 Copy 樣例輸出 Copy 提示 code 題目描述 馬上要舉辦新生程序設計競賽了&#xff0c;與以往不同的是&#xff0c;本次比賽以班為單位&#xff0c;為了全面衡量一個班級的整體水平&#xff0c;要求從一個班的m位同學中任選k位同學代表本…

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer與fence機制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer與fence機制&#xff08;2&#xff09; 計算fps幀率 用 adb shell dumpsys SurfaceFlinger --list 查詢當前的SurfaceView&#xff0c;然后有好多行&#xff0c;再把要查詢的行內容完整的傳給 ad…

算法訓練Day35 | ● 343. 整數拆分 ● 96.不同的二叉搜索樹

343. 整數拆分 class Solution { public:int integerBreak(int n) {vector<int> dp(n1, 0);dp[2] 1;for(int i3; i<n1; i){for(int j 1; j<i/2; j){dp[i] max(dp[i], max(j*(i-j), j*dp[i-j]));}}return dp[n];} };參考文章&#xff1a;代碼隨想錄-343. 整數拆分…

找不到msvcp140.dll無法執行代碼的原因分析及修復方法

當用戶在嘗試運行某些應用程序或游戲時&#xff0c;可能會遇到系統彈出錯誤提示&#xff0c;顯示“找不到msvcp140.dll無法執行代碼”這一錯誤信息&#xff0c;它會導致程序無法正常啟動。為了解決這個問題&#xff0c;我經過多次嘗試和總結&#xff0c;找到了以下五種解決方法…

hadoop啟動后沒有namenode,datanode等解決方法

之前用的是虛擬機&#xff0c;在虛擬機上安裝的hadoop&#xff0c;但是后來&#xff0c;電腦恢復出廠設置了&#xff0c;什么都重新開始。就在本地安裝 Linux 子系統。 但是&#xff0c;有時候start-dfs.sh后&#xff0c;jps出現錯誤。 像這種拒絕連接 解決辦法就是如下&…

我的創作紀念日1460天(4年)

機緣 作為一名技術愛好者&#xff0c;我最初成為創作者的初心源于對知識的渴望和對分享的熱情。在參與多個實戰項目的過程中&#xff0c;我積累了豐富的經驗&#xff0c;這些經驗不僅僅是代碼和解決方案&#xff0c;更多的是對問題本質的理解和解決問題的思維方式。我意識到&a…

題目----力扣--移除鏈表元素

題目 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 輸出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 輸入&…

如何編譯不同目錄下的兩個文件

1.直接編譯 2.打包成動靜態庫進行鏈接

【智能優化算法】蜜獾優化算法(Honey Badger Algorithm,HBA)

蜜獾優化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”&#xff08;IF 3.6&#xff09;的2022年智能優化算法 01.引言 蜜獾優化算法(Honey Badger Algorithm,HBA)受蜜獾智能覓食行為的啟發&#xff0c;從數學上發展出一種求解優化問題的…

【AMBA Bus ACE 總線 9 -- Non-cache IO device】

請閱讀【AMBA Bus ACE 總線與Cache 專欄 】 歡迎學習:【嵌入式開發學習必備專欄】 文章目錄 ACE Non-cache IO device非緩存I/O的工作原理在ARM中配置非緩存I/O示例場景Non-cache IO device Cache 訪問ACE Non-cache IO device 在ARM架構中,ACE(AXI Coherency Extension,…

Flask 統一攔截器

import osfrom flask import Flask, request, sessionapp Flask(__name__) app.config[SECRET_KEY] os.urandom(24) # 生成24位的隨機數種子&#xff0c;用于產生SESSION IDapp.route(/article/<int:article_id>) def test(article_id):"""路由地址參數…

變量的細節

如何打印不同類型的整數常量 相似于我們需要去聲明類型 public class Var {public static void main(String[] args) {// 1就是int類型常量System.out.println(1);// 120后面加一個L(l)表示他是一個long型的整數System.out.println(120l);} }如何打印不同類型的浮點數常量 與…

解決電腦睡眠后,主機ping不通VMware虛擬機

文章目錄 問題解決方法方法一方法二注意 問題 原因&#xff1a;電腦休眠一段時間&#xff0c;再次打開電腦就ping不通VMware虛擬機。 解決方法 方法一 重啟電腦即可&#xff0c;凡是遇到電腦有毛病&#xff0c;重啟能解決90%問題。但是重啟電腦比較慢&#xff0c;而且重啟…

C++用類模板封裝容器

要實現輸出不同容器的值&#xff0c;且各容器包含的數據類型也不同&#xff0c;可以使用類模板和函數模板來實現。 示例代碼如下&#xff1a; #include <iostream> #include <vector> #include <list>template <typename T> class Container { privat…