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,并以channel的name作為key注冊到消息使者中。
BinaryMessenger 并不知道 Channel的存在, 它只和 BinaryMessageHandler 打交道。 而 Channel和 BinaryMessageHandler 則 是 一 一 對 應(yīng) 的。由 于 Channel從 BinaryMessageHandler接收到的消息是二進(jìn)制格式數(shù)據(jù),無法直接使用,故 Channel會將該二進(jìn)制消息通過 Codec(消息編解碼器)解碼為能識別的消息,并傳遞給Channel的 Handler 處理。當(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:-]
}