Flutter開發(fā)進(jìn)階:Channel

1.Channel原理

Flutter定義了三種類型的Channel,分別是:

  • BasicMessageChannel:傳遞字符串和半結(jié)構(gòu)化信息。
  • MethodChannel:傳遞方法調(diào)用。
  • EventChannel:用于數(shù)據(jù)流通信。
    每種類類型的Channel各有用途,設(shè)計(jì)上非常相似,如:
  • String類型的name,代表channel的名字,也是唯一標(biāo)識符號。
  • BinaryMessager類型的messager,代表消息使者,是是Flutter與Platform端消息發(fā)送和接受的工具。
  • MessageCodec類型或者MethodCodec類型的codec`,代表消息的編解碼器。

BinaryMessager通信的數(shù)據(jù)格式是二進(jìn)制格式數(shù)據(jù)。實(shí)例化一個(gè)channel,并設(shè)置handler時(shí),在內(nèi)部會生成一個(gè)BinaryMessageHandler,并以channelname作為key注冊到消息使者中。

BinaryMessenger 并不知道 Channel的存在, 它只和 BinaryMessageHandler 打交道。 而 ChannelBinaryMessageHandler 則 是 一 一 對 應(yīng) 的。由 于 ChannelBinaryMessageHandler接收到的消息是二進(jìn)制格式數(shù)據(jù),無法直接使用,故 Channel會將該二進(jìn)制消息通過 Codec(消息編解碼器)解碼為能識別的消息,并傳遞給ChannelHandler 處理。當(dāng) Handler處理完消息之后,會通過回調(diào)函數(shù)返回result,并將result通過編解碼器編碼為二進(jìn)制格式數(shù)據(jù),通過BinaryMessenger發(fā)送回Flutter端。

2.Channel使用

2.1.FlutterMethodChannel

//ios
FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"explor" binaryMessenger:self.engine.binaryMessenger];
[channel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult  _Nonnull result) {
       //接收來自flutter的消息   
}];
[channel invokeMethod:@"setColor" arguments:@{}];//調(diào)用flutter側(cè)方法

//flutter
MethodChannel channel = MethodChannel("explor");
channel.setMethodCallHandler((call){
      //接收來自app的消息
});
channel.invokeMethod("method", {});//調(diào)用app側(cè)方法

2.2.FlutterBasicMessageChannel

//iOS
FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel messageChannelWithName:@"explor" binaryMessenger:self.engine.binaryMessenger];
[channel setMessageHandler:^(id  _Nullable message, FlutterReply  _Nonnull callback) {
     //接收來自flutter的消息
}];
[channel sendMessage:@{}];//發(fā)送給flutter的消息

//flutter
BasicMessageChannel channel = BasicMessageChannel("explor", StandardmessageCodec());
channel.setMessageHandler((message){
      //來自App的消息
}); 
channel.send("-----")//發(fā)給App的消息

2.3.EventChannel

//ios
FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:@"explor" binaryMessenger:self.engine.binaryMessenger];
[channel setStreamHandler:streamHandler]; //在streamHandler中接收消息


//flutter
EventChannel channel2 = EventChannel("explor");
channel2.receiveBroadcastStream().listen((event) {

}, onError: (error){

});

3.Flutter引擎源碼

https://blog.csdn.net/dongzhong1990/article/details/105678124
源碼主要分為兩部分:
Flutter官方源碼下載路徑:
engine: https://github.com/flutter/engine
flutter framework: https://github.com/flutter/flutter

  • Engine,是可供Flutter宿主應(yīng)用提供的一個(gè)可移植運(yùn)行時(shí)。Engine實(shí)現(xiàn)了Flutter的核心庫,包括動(dòng)畫、圖形、文件、網(wǎng)絡(luò)I/O、訪問支持、插件架構(gòu)和Dart的運(yùn)行時(shí)、編譯工具鏈;
  • Flutter Framework,大部分的Flutter開發(fā)者主要通過Flutter Framework交互。Framework提供了一個(gè)現(xiàn)代的、可交互的框架,以及一個(gè)豐富的平臺、布局、基礎(chǔ)部件的集合。

3.1.解碼器

三種channel有2種解碼器,解碼器實(shí)際上是一種數(shù)據(jù)轉(zhuǎn)換協(xié)議,iOS、Android、dart三端通用。

FlutterMessageCodec

@protocol FlutterMessageCodec
+ (instancetype)sharedInstance;
- (NSData * _Nullable)encode:(id _Nullable)message;
- (id _Nullable)decode:(NSData * _Nullable)message;
@end

FlutterMethodCodec

服務(wù)Methodchannel、EventChannel

@protocol FlutterMethodCodec
+ (instancetype)sharedInstance;
- (NSData *)encodeMethodCall:(FlutterMethodCall *)methodCall;
- (NSData *)decodeMethodCall:(NSData *)methodCall;
- (NSData *)encodeSuccessEnvelope:(id _Nullable)result;
- (NSData *)encodeErrorEnvelope:(FlutterError *)error;
- (id _Nullanle)decodeEnvelope:(NSData *)envelope;
@end

FlutterStandardReaderWriter

  • FlutterStandardReader
- (nullable id)readValue {
  //
  [self readValueOfType:[self readByte]]
}

- (nullable id)readValueOfType:(UInt8)type{
  
}
  • FlutterStandardWriter
- (void)writeValue:(id)value {
  //判斷類型
  //寫入標(biāo)志位(數(shù)據(jù)類型)+數(shù)據(jù)本身
  [- writeByte:]
  [- writeBytes:- length:-]
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容