1.Channel原理
Flutter
定義了三種類型的Channel临庇,分別是:
-
BasicMessageChannel
:傳遞字符串和半結(jié)構(gòu)化信息反璃。 -
MethodChannel
:傳遞方法調(diào)用昵慌。 -
EventChannel
:用于數(shù)據(jù)流通信。
每種類類型的Channel各有用途淮蜈,設(shè)計(jì)上非常相似斋攀,如: -
String
類型的name
,代表channel
的名字梧田,也是唯一標(biāo)識(shí)符號(hào)淳蔼。 -
BinaryMessager
類型的messager
,代表消息使者裁眯,是是Flutter與Platform端消息發(fā)送和接受的工具肖方。 -
MessageCodec
類型或者MethodCodec
類型的codec`,代表消息的編解碼器未状。
BinaryMessager
通信的數(shù)據(jù)格式是二進(jìn)制格式數(shù)據(jù)俯画。實(shí)例化一個(gè)channel
,并設(shè)置handler
時(shí)司草,在內(nèi)部會(huì)生成一個(gè)BinaryMessageHandler
艰垂,并以channel
的name
作為key
注冊到消息使者中。
BinaryMessenger
并不知道 Channel
的存在埋虹, 它只和 BinaryMessageHandler
打交道猜憎。 而 Channel
和 BinaryMessageHandler
則 是 一 一 對 應(yīng) 的。由 于 Channel
從 BinaryMessageHandler
接收到的消息是二進(jìn)制格式數(shù)據(jù)搔课,無法直接使用胰柑,故 Channel
會(huì)將該二進(jìn)制消息通過 Codec
(消息編解碼器)解碼為能識(shí)別的消息,并傳遞給Channel
的 Handler
處理爬泥。當(dāng) Handler
處理完消息之后柬讨,會(huì)通過回調(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è)豐富的平臺(tái)姑丑、布局、基礎(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:-]
}