Flutter與原生通信

官方推薦插件輔助工具 - pigeon

參考文章:Flutter學(xué)習(xí)-Channel詳解

一劳淆、通道channel分類

1、BasicMessageChannel
用于支持MessageCodec編解碼器的類型消息的異步傳遞通道劫谅。

2谦屑、MethodChannel
用于支持MethodCodec編解碼器的方法的異步調(diào)用通道谤碳。

3、OptionalMethodChannel
MethodChannel基礎(chǔ)上,支持了當(dāng)invokeMethod沒有找到平臺插件時染簇,不會拋出異常而返回null

4强岸、EventChannel
用于事件流的傳遞锻弓,但是事件值必須支持MethodCodec編解碼器。

image.png

二蝌箍、通道channel結(jié)構(gòu)

1青灼、結(jié)構(gòu)
每個channel都有3個參數(shù):nameMessageCodec/MethodCodec妓盲、BinaryMessenger
name:用通道名稱來標(biāo)識通道的唯一杂拨。
MessageCodec/MethodCodec:通道數(shù)據(jù)的編解碼器。
BinaryMessenger:二進(jìn)制消息數(shù)據(jù)的發(fā)送和接收信使悯衬。

2弹沽、BinaryMessenger信使
Flutter中定義為抽象類abstract class BinaryMessenger,其中定義了幾個接口:

Future<void> handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback);
Future<ByteData?> send(String channel, ByteData? message);
void setMessageHandler(String channel, MessageHandler? handler);
bool checkMessageHandler(String channel, MessageHandler? handler);
void setMockMessageHandler(String channel, MessageHandler? handler);
bool checkMockMessageHandler(String channel, MessageHandler? handler);

iOS中則對應(yīng)為:

@protocol FlutterBinaryMessenger <NSObject>
/**
 * Sends a binary message to the Flutter side on the specified channel, expecting
 * no reply.
 *
 * @param channel The channel name.
 * @param message The message.
 */
- (void)sendOnChannel:(NSString*)channel message:(NSData* _Nullable)message;

/**
 * Sends a binary message to the Flutter side on the specified channel, expecting
 * an asynchronous reply.
 *
 * @param channel The channel name.
 * @param message The message.
 * @param callback A callback for receiving a reply.
 */
- (void)sendOnChannel:(NSString*)channel
              message:(NSData* _Nullable)message
          binaryReply:(FlutterBinaryReply _Nullable)callback;

/**
 * Registers a message handler for incoming binary messages from the Flutter side
 * on the specified channel.
 *
 * Replaces any existing handler. Use a `nil` handler for unregistering the
 * existing handler.
 *
 * @param channel The channel name.
 * @param handler The message handler.
 * @return An identifier that represents the connection that was just created to the channel.
 */
- (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channel
                                          binaryMessageHandler:
                                              (FlutterBinaryMessageHandler _Nullable)handler;

/**
 * Clears out a channel's message handler if that handler is still the one that
 * was created as a result of
 * `setMessageHandlerOnChannel:binaryMessageHandler:`.
 *
 * @param connection The result from `setMessageHandlerOnChannel:binaryMessageHandler:`.
 */
- (void)cleanupConnection:(FlutterBinaryMessengerConnection)connection;
@end

iOS端筋粗,binaryMessengerFlutterViewController的一個屬性策橘,通過繼承來獲取binaryMessenger
具體在創(chuàng)建channel的時候使用:

let aliPayMethodChannel = FlutterMethodChannel(name: "aliPay", binaryMessenger: binaryMessenger)

三亏狰、數(shù)據(jù)類型對應(yīng)

Flutter役纹、AndroidiOS各個平臺數(shù)據(jù)類型對應(yīng)關(guān)系如下:

Dart.png

在進(jìn)行數(shù)據(jù)傳遞的時候暇唾,通過轉(zhuǎn)為字節(jié)byte進(jìn)行轉(zhuǎn)換促脉。

四、消息的編碼解碼器

1策州、 MessageCodec
包括:BinaryCodec瘸味、StringCodecJSONMessageCodec够挂、StandardMessageCodec

// 直接使用二進(jìn)制數(shù)據(jù)
class BinaryCodec implements MessageCodec<ByteData?>
// 字符串與二進(jìn)制數(shù)據(jù)之間的轉(zhuǎn)換
class StringCodec implements MessageCodec<String?>
// utf8編碼的json數(shù)據(jù)與二進(jìn)制數(shù)據(jù)的轉(zhuǎn)換 - 用于大部分場景
class JSONMessageCodec implements MessageCodec<dynamic>

class StandardMessageCodec implements MessageCodec<dynamic>

2旁仿、 MethodCodec
包括:JSONMethodCodecStandardMethodCodec

class JSONMethodCodec implements MethodCodec
class StandardMethodCodec implements MethodCodec

五、給channel設(shè)置回調(diào)Handler

每一種channel對應(yīng)一種回調(diào)枯冈,包含有以下3種:

typedef void (^FlutterMessageHandler)(id _Nullable message, FlutterReply callback);
typedef void (^FlutterMethodCallHandler)(FlutterMethodCall* call, FlutterResult result);
@protocol FlutterStreamHandler
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
                                       eventSink:(FlutterEventSink)events;
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments;
@end

六毅贮、線程

Flutter中的線程

共有4個線程:
1、Platform thread(平臺線程):plugin的代碼運行在這里尘奏,對應(yīng)安卓和iOSmain主線程
2滩褥、UI threadUI線程):執(zhí)行Dart代碼的線程,包括項目代碼和Flutter框架的代碼炫加。UI線程會生成一個圖層樹瑰煎,發(fā)送到GPU線程渲染到設(shè)備。
3俗孝、Raster thread(光柵線程):拿到圖層樹后酒甸,交給GPU渲染處理。
4赋铝、I/O線程:執(zhí)行I/O輸入和輸出操作插勤。

由此可知,channel在原生側(cè)運行在Platform thread(平臺線程)里柬甥,即原生的主線程里饮六。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末其垄,一起剝皮案震驚了整個濱河市苛蒲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绿满,老刑警劉巖臂外,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喇颁,居然都是意外死亡漏健,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門橘霎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姐叁,你說我怎么就攤上這事瓦盛。” “怎么了外潜?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵原环,是天一觀的道長。 經(jīng)常有香客問我处窥,道長嘱吗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任滔驾,我火速辦了婚禮谒麦,結(jié)果婚禮上俄讹,老公的妹妹穿的比我還像新娘。我一直安慰自己绕德,他們只是感情好颅悉,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迁匠,像睡著了一般剩瓶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上城丧,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天延曙,我揣著相機(jī)與錄音,去河邊找鬼亡哄。 笑死枝缔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚊惯。 我是一名探鬼主播愿卸,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼截型!你這毒婦竟也來了趴荸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宦焦,失蹤者是張志新(化名)和其女友劉穎发钝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體波闹,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡酝豪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了精堕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵淘。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖歹篓,靈堂內(nèi)的尸體忽然破棺而出瘫证,到底是詐尸還是另有隱情,我是刑警寧澤滋捶,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布痛悯,位于F島的核電站,受9級特大地震影響重窟,放射性物質(zhì)發(fā)生泄漏载萌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扭仁。 院中可真熱鬧垮衷,春花似錦、人聲如沸乖坠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熊泵。三九已至仰迁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顽分,已是汗流浹背徐许。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留卒蘸,地道東北人雌隅。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像缸沃,于是被迫代替她去往敵國和親恰起。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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