flutter與原生通信主要有三種方式:MethodChannel、EventChannel、BasicMessageChannel,這三種方式均各有適用的場景:MethodChannel用于native與flutter的方法調(diào)用,EventChannel用于native單向的向flutter發(fā)送廣播消息,BasicMessageChannel用于native與flutter之間的消息互發(fā)。

站在用戶的角度思考問題,與客戶深入溝通,找到臨洮網(wǎng)站設計與臨洮網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋臨洮地區(qū)。
MethodChannel用于雙方之間的方法互調(diào),使用步驟是:
1.創(chuàng)建一個MethodChannel對象,傳入MethodChannel名稱。
2.使用setMethodHandle對對方調(diào)用自己的方法進行監(jiān)聽,通過回調(diào)中的MethodCall對象方法名判斷、獲取方法參數(shù),并且返回調(diào)用結果。
3.使用invokeMethod來調(diào)用對方的方法,可傳入方法名,方法參數(shù),以及監(jiān)聽對方的回調(diào)結果。
以下是示例:
需要注意的是,MethodChannel的名稱需要雙方保持一致,否則就不是同一個MethodChannel了。另外這里的方法調(diào)用并不是像Java里面反射那樣去先找到class示例對象再解析到相應的方法,而是將雙方互發(fā)的消息包裝成了MethodCall對象,拿到這個對象后通過MethodCall里面的方法名去判斷要做什么操作,并不是直接就調(diào)用了自身(native或flutter)相對應的方法。具體要做什么操作、調(diào)用什么方法還是得自己去調(diào)用和實現(xiàn)。
EventChannel適用于native向flutter發(fā)送廣播消息,只是單向的消息發(fā)送,native發(fā),flutter收,返過來flutter并不能向native發(fā)送消息。例如native可將定位數(shù)據(jù)不斷的報給flutter,或者錄像數(shù)據(jù)等等,所有基于原生能力產(chǎn)生的數(shù)據(jù)都可以通過EventChannel進行發(fā)送。
步驟:
1.創(chuàng)建一個EventChannel對象,傳入EventChannel名稱。
2.flutter端調(diào)用receiveBroadcastStream進行廣播消息注冊,傳入arguments參數(shù)即為廣播名稱,此參數(shù)是告訴native端你要接受的廣播類型,判別是什么廣播發(fā)送的數(shù)據(jù)。
2.native調(diào)用setStreamHandler方法進行廣播消息監(jiān)聽,onListen回調(diào)里會有一個arguments參數(shù),這里及為flutter注冊的廣播類型,若flutter端沒有注冊,則native端不會收到這個回調(diào),也就無法進行消息發(fā)送。收到flutter端的廣播注冊后,根據(jù)arguments可判斷廣播類型,然后根據(jù)EventChannel.EventSink來進行消息發(fā)送,EventSink.success()即可將消息發(fā)送給flutter端。
3.flutter進行廣播注冊會返回一個streamSubscription類型的對象,該對象可以進行消息的停止,native可在onCancel回調(diào)里面收到。
示例如下:
BasicMessageChannel就是比較常用的消息互發(fā),使用步驟如下:
1.創(chuàng)建BasicMessageChannel對象,傳入BasicMessageChannel名稱。還需傳入編解碼方式(可以自己實現(xiàn)),系統(tǒng)提供了一些列的編解碼方式,后續(xù)會介紹到。
2.使用setMessageHandler方法進行消息監(jiān)聽,也可進行回復。
3.使用send方法進行消息發(fā)送。
無論哪種方式的消息傳遞,最終都是將自定義數(shù)據(jù)轉化為二進制數(shù)據(jù)進行傳遞,flutter提供的編解碼方式分為MethodCodec和MessageCodec兩種,EventChannel和MethodChannel使用的就是MethodCodec,BasicMessageChannel使用的是MessageCodec。MethodCodec其實就是在MessageCodec的基礎上將數(shù)據(jù)包裝了一下,使其轉化為MethodCall對象方便使用。
MethodCodec源碼:
MethodCodec提供了兩種方式:JSONMethodCodec和StandardMethodCodec,前一種就是JSON和MethodCall對象之間的互轉,后一種則是根據(jù)傳入的數(shù)據(jù)基本類型(String,Integer等)來進行互轉。
MessageCodec則提供了四種方式,如下圖,具體就不詳細講述了,看看名字就知道是怎么回事,可以直接去看源碼。最常用和默認的就是StandardMessageCodec方式。
從上面的使用方式可以看出,每一種Channel在創(chuàng)建的時候都需要傳遞一個BinaryMessenger,這個接口可以在FlutterEngine里面拿到,因此需要在FlutterActivity里面實現(xiàn)configFlutterEngine方法里面重寫這個方法。FlutterActivity在attach FlutterEngine之后就會調(diào)用這個configFlutterEngine方法,通過flutterEngine.getPlugins().add(FlutterPlugin)方法可以FlutterPlugin的回調(diào)方法里進行數(shù)據(jù)的初始化和銷毀工作。如下圖
這個回調(diào)方法里的FlutterPluginBinding提供了一些我們可能會用到的對象,如下:
在做這個小 demo 的時候,遇到了一些坑,到文章發(fā)布 坑 還是沒有填好,無奈,只得用了別的方式實現(xiàn)了本篇文章的功能。
我這個人的缺點就是 愛鉆牛角尖,哎
廢話不多說,看效果圖
那么,我們開始吧!
我們先看界面邏輯,先不考慮功能,然后將此布局給予上層
注意看這一行
這行其實作用就是聲明了 鏈接 Android 原生的 MethodChannel
當然了,里面的內(nèi)容隨意, 你看我寫的多隨意
而真正的調(diào)用邏輯是
對 就是 invokeMethod 這個方法
當然這個方法的使用還有「帶參數(shù)的使用方法」
再來看下方法的實現(xiàn)
ok,到此,F(xiàn)lutter 的邏輯就基本走完了,現(xiàn)在來看下 Android 的邏輯
這里,是我浪費了點時間的一個坑,我以為我可以直接在 Flutter 的項目結構下去更改 Android 的項目,結果證明我還是 too young 了,好了,說下我的方法,我是直接切換到了 Android 的項目結構,如下圖
這樣就可以進入 Android 的結構了
很簡單,你想實現(xiàn)相互調(diào)用,那么肯定得有 暗號 吧
這里是通過
來實現(xiàn)的
其中 MethodCall 能夠判斷 Flutter 傳遞過來什么名稱的參數(shù),得到參數(shù)的內(nèi)容等
而 MethodChannel.Result 則能夠返回結果給 Flutter
上面的截圖就是通過這兩個類來實現(xiàn)的邏輯
定義依賴
定義 Bean
定義網(wǎng)絡接口
實現(xiàn) RetrofitHelper
通過 jakewharton 封裝的 rxrelay 結合 rxjava2 實現(xiàn) rxbus
Android Flutter 互調(diào)
MethodChannel 在 Flutter 及 Android 中的使用
Flutter 頁面跳轉
RxBus 封裝
Bingo
謝謝小伙伴的關注、收藏、點贊,謝謝~~
1 File-New Flutter Project -Flutter-next選擇 project type(Android studio不同版本會有所差異)
參考鏈接:
2.1本地引入
這里plugin是flutter module引入使用,如果想project引用其實可以直接在.android下面創(chuàng)建插件
2.2遠程引用
一、 MethodChannel
主要是flutter端調(diào)用android方法。flutter調(diào)取android方法,也可以android主動跟flutter通信,但是這個只能是傳遞數(shù)據(jù),不是調(diào)方法。MethodChannel的flutter調(diào)取android方法,我之前寫過,可以查看如下鏈接,
Android主動跟flutter通信,如下
二、 BasicMessageChannel
它是可以雙端通信的,flutter端可以給Android發(fā)送消息,Android也可以給Flutter發(fā)送消息。
三、EventChannel
只能是原生發(fā)送消息給Flutter端,例如監(jiān)聽手機電量變化,網(wǎng)絡變化,傳感器等。
打印結果如下:
總結一下:
MethodChannel 用于傳遞方法調(diào)用(method invocation),是flutter調(diào)取原生方法的,也可以原生主動傳遞數(shù)據(jù)給Flutter。
BasicMessageChannel 用于傳遞字符串和半結構化的信息。是兩個端相互發(fā)送數(shù)據(jù),接收數(shù)據(jù)的。
EventChannel 用于數(shù)據(jù)流(event streams)的通信。通長用于Nativie向flutter的通信,如:手機電量變化,網(wǎng)絡連接變化,陀螺儀,傳感器等;
tip:多種類型的通道混用可能會出現(xiàn)報錯問題。
背景:flutter組件嵌套都很深,依次傳遞數(shù)據(jù)很麻煩,所以最好是能夠跨組件傳遞。有三張跨組件的方式:InheritedWidget、Notification、Eventbus.
是一種自上而下的傳遞數(shù)據(jù)的方式。
使用步驟:
它的數(shù)據(jù)流動方式和InheritedWidget剛好相反,從子控件向上面?zhèn)鬟f。
具體使用
跟android 原生的eventbus原理和使用一樣。
文章題目:flutter互傳參數(shù),flutter數(shù)據(jù)傳遞
文章網(wǎng)址:http://chinadenli.net/article13/dsioeds.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、虛擬主機、App開發(fā)、搜索引擎優(yōu)化、網(wǎng)站排名、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)