Flutter 開發(fā) (3)Flutter 與 Native 的交互

一泛释、Flutter 中 Channel 基本概念

1. Flutter 中 Channel 的概念
  • Channel 也就是通道的意思葫男,主要是用于和 原生Native之間進行交互 钧敞,雙方相互傳遞數(shù)據(jù)克胳。
  • Channel 在Native的端就是一個類亭珍。
2. Flutter 中 Channel 有哪些

三種Channel之間互相獨立杨箭,各有用途嗜历,但它們在設(shè)計上卻非常相近俱济。

  • BasicMessageChannel:用于傳遞字符串和半結(jié)構(gòu)化的信息误阻。

  • MethodChannel:用于傳遞方法調(diào)用(method invocation)债蜜。

  • EventChannel: 用于數(shù)據(jù)流(event streams)的通信(例如 NSData)。

二究反、Flutter 中 Channel 的詳細(xì)介紹

1. Channel 的成員變量屬性
每種Channel均有三個重要成員變量:
  • name:String類型寻定,代表Channel的名字,也是其唯一標(biāo)識符精耐。
  • messager:BinaryMessenger類型狼速,代表消息信使,是消息的發(fā)送與接收的工具黍氮。
  • codec: MessageCodec 類型 或MethodCodec類型唐含,代表消息的編解碼器。
2. Channel 的成員變量 - name
  • 一個Flutter應(yīng)用中可能存在多個Channel沫浆,每個Channel在創(chuàng)建時必須指定一個獨一無二的name捷枯,Channel之間使用 name 來區(qū)分彼此。
  • 當(dāng)有消息從 Flutter端 發(fā)送到 Native端 時专执,會根據(jù)其傳遞過來的 channel name 找到該Channel對應(yīng)的Handler(消息處理器)淮捆。
(1)Channel 的成員變量 - BinaryMessenger
  • BinaryMessenger是Platform端與Flutter端通信的工具,傳遞數(shù)據(jù)格式為二進制本股。

  • 當(dāng)我們初始化一個Channel攀痊,并向該Channel注冊處理消息的Handler時,實際上會生成一個與之對應(yīng)的 BinaryMessageHandler 拄显,并以 channel name 為 key苟径,注冊到BinaryMessenger 中。

  • 當(dāng)Flutter端發(fā)送消息到BinaryMessenger時躬审,BinaryMessenger會根據(jù)其入?yún)hannel找到對應(yīng)的BinaryMessageHandler棘街,并交由其處理蟆盐。

Binarymessenger 在 iOS 和 Android 上分別是什么?
  • Binarymessenger 在Android端是一個接口遭殉,其具體實現(xiàn)為FlutterNativeView石挂。
  • 在iOS端是一個協(xié)議,名稱為FlutterBinaryMessenger险污,F(xiàn)lutterViewController 遵循了它痹愚。
(3) Channel 的成員變量 - codec (消息編解碼器)
  • Codec主要用于將二進制格式的數(shù)據(jù)轉(zhuǎn)化為Handler能夠識別的數(shù)據(jù)。
抽象邏輯
  • (示例 StringCodec, BinaryCode, JSONMessageCodec)
如何解決數(shù)據(jù)傳遞編解碼問題蛔糯?
  • 由于Channel從BinaryMessageHandler接收到的消息是 二進制格式數(shù)據(jù) 拯腮,無法直接使用,故Channel會將該二進制消息通過Codec(消息編解碼器)解碼為能識別的消息并傳遞給Handler進行處理渤闷。
    ?* 當(dāng)Handler處理完消息之后疾瓮,會通過回調(diào)函數(shù)返回result,并將result通過編解碼器編碼為二進制格式數(shù)據(jù)飒箭,通過BinaryMessenger發(fā)送回Flutter端狼电。
Codec 的介紹

Flutter定義了兩種Codec:MessageCodec 和 MethodCodec。

MessageCodec 有多種不同實現(xiàn)
  • BinaryCodec

    • BinaryCodec 在編解碼過程中什么都沒做弦蹂,只是原封不動將二進制數(shù)據(jù)消息返回而已肩碟。
    • 其返回值類型和入?yún)⒌念愋拖嗤鶠槎M制格式(Android中為ByteBuffer凸椿,iOS中為NSData)
  • StringCodec

    • StringCodec 用于字符串與二進制數(shù)據(jù)之間的編解碼削祈,其編碼格式為UTF-8。
  • JSONMessageCodec

    • JSONMessageCodec用于基礎(chǔ)數(shù)據(jù)與二進制數(shù)據(jù)之間的編解碼脑漫,其支持基礎(chǔ)數(shù)據(jù)類型以及列表髓抑、字典。其在iOS端使用了NSJSONSerialization作為序列化的工具优幸,而在Android端則使用了其自定義的JSONUtil與StringCodec作為序列化工具吨拍。
  • StandardMessageCodec (默認(rèn)如果不指定)

    • StandardMessageCodec 是BasicMessageChannel的默認(rèn)編解碼器,其支持基礎(chǔ)數(shù)據(jù)類型网杆、二進制數(shù)據(jù)羹饰、列表、字典碳却。
MethodCodec 有多種不同實現(xiàn)
  • JSONMethodCodec
    JSONMethodCodec的編解碼依賴于JSONMessageCodec队秩,當(dāng)其在編碼MethodCall時,會先將MethodCall轉(zhuǎn)化為字典{"method":method,"args":args}昼浦。其在編碼調(diào)用結(jié)果時馍资,會將其轉(zhuǎn)化為一個數(shù)組,調(diào)用成功為[result]关噪,調(diào)用失敗為[code,message,detail]鸟蟹。再使用JSONMessageCodec將字典或數(shù)組轉(zhuǎn)化為二進制數(shù)據(jù)物舒。
  • StandardMethodCodec
    MethodCodec的默認(rèn)實現(xiàn),StandardMethodCodec的編解碼依賴于StandardMessageCodec戏锹,當(dāng)其編碼MethodCall時,會將method和args依次使用StandardMessageCodec編碼火诸,寫入二進制數(shù)據(jù)容器锦针。其在編碼方法的調(diào)用結(jié)果時,若調(diào)用成功置蜀,會先向二進制數(shù)據(jù)容器寫入數(shù)值0(代表調(diào)用成功)奈搜,再寫入StandardMessageCodec編碼后的result。而調(diào)用失敗盯荤,則先向容器寫入數(shù)據(jù)1(代表調(diào)用失敳雎稹),再依次寫入StandardMessageCodec編碼后的code秋秤,message和detail宏粤。

抽象邏輯圖

Flutter 中 Channel 具體實現(xiàn)

  • FlutterMethodChannel


  • FlutterBasicMessageChannel


參考文章整理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灼卢,隨后出現(xiàn)的幾起案子绍哎,更是在濱河造成了極大的恐慌,老刑警劉巖鞋真,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇堰,死亡現(xiàn)場離奇詭異,居然都是意外死亡涩咖,警方通過查閱死者的電腦和手機海诲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩互,“玉大人特幔,你說我怎么就攤上這事《芩疲” “怎么了敬辣?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長零院。 經(jīng)常有香客問我溉跃,道長,這世上最難降的妖魔是什么告抄? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任撰茎,我火速辦了婚禮,結(jié)果婚禮上打洼,老公的妹妹穿的比我還像新娘龄糊。我一直安慰自己逆粹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布炫惩。 她就那樣靜靜地躺著僻弹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪他嚷。 梳的紋絲不亂的頭發(fā)上蹋绽,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音筋蓖,去河邊找鬼卸耘。 笑死,一個胖子當(dāng)著我的面吹牛粘咖,可吹牛的內(nèi)容都是我干的蚣抗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓮下,長吁一口氣:“原來是場噩夢啊……” “哼翰铡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唱捣,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤两蟀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后震缭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赂毯,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年拣宰,在試婚紗的時候發(fā)現(xiàn)自己被綠了党涕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巡社,死狀恐怖膛堤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晌该,我是刑警寧澤肥荔,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站朝群,受9級特大地震影響燕耿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姜胖,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一誉帅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦蚜锨、人聲如沸档插。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郭膛。三九已至,卻和暖如春氛悬,著一層夾襖步出監(jiān)牢的瞬間饲鄙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工圆雁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆谍。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓伪朽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汛蝙。 傳聞我的和親對象是個殘疾皇子烈涮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 我們都知道Flutter開發(fā)的app是可以同時在iOS和Android系統(tǒng)上運行的。顯然Flutter需要有...
    HowHardCanItBe閱讀 20,597評論 12 27
  • ### YUV顏色空間 視頻是由一幀一幀的數(shù)據(jù)連接而成窖剑,而一幀視頻數(shù)據(jù)其實就是一張圖片坚洽。 yuv是一種圖片儲存格式...
    天使君閱讀 3,282評論 0 4
  • 原文:https://developer.android.com/reference/android/media/...
    thebestofrocky閱讀 6,066評論 0 6
  • 實時消息協(xié)議---流的分塊 版權(quán)聲明: 版權(quán)(c)2009 Adobe系統(tǒng)有限公司。全權(quán)所有西土。 摘要: 本備忘錄描...
    一個人zy閱讀 1,898評論 0 9
  • 目錄 I [情感]且說誰不愛(22) (23)一家三口 夏季的清晨來的很早讶舰,也就是在太陽露頭之前的早上,清涼需了,小區(qū)...
    波米閱讀 388評論 0 17