一泛释、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