1.Channel原理
Flutter
定义了三种类型的Channel,分别是:
-
BasicMessageChannel
:传递字符串和半结构化信息。 -
MethodChannel
:传递方法调用。 -
EventChannel
:用于数据流通信。
每种类类型的Channel各有用途,设计上非常相似,如: -
String
类型的name
,代表channel
的名字,也是唯一标识符号。 -
BinaryMessager
类型的messager
,代表消息使者,是是Flutter与Platform端消息发送和接受的工具。 -
MessageCodec
类型或者MethodCodec
类型的codec`,代表消息的编解码器。
BinaryMessager
通信的数据格式是二进制格式数据。实例化一个channel
,并设置handler
时,在内部会生成一个BinaryMessageHandler
,并以channel
的name
作为key
注册到消息使者中。
BinaryMessenger
并不知道 Channel
的存在, 它只和 BinaryMessageHandler
打交道。 而 Channel
和 BinaryMessageHandler
则 是 一 一 对 应 的。由 于 Channel
从 BinaryMessageHandler
接收到的消息是二进制格式数据,无法直接使用,故 Channel
会将该二进制消息通过 Codec
(消息编解码器)解码为能识别的消息,并传递给Channel
的 Handler
处理。当 Handler
处理完消息之后,会通过回调函数返回result
,并将result
通过编解码器编码为二进制格式数据,通过BinaryMessenger
发送回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:@{}];//调用flutter侧方法
//flutter
MethodChannel channel = MethodChannel("explor");
channel.setMethodCallHandler((call){
//接收来自app的消息
});
channel.invokeMethod("method", {});//调用app侧方法
2.2.FlutterBasicMessageChannel
//iOS
FlutterBasicMessageChannel *channel = [FlutterBasicMessageChannel messageChannelWithName:@"explor" binaryMessenger:self.engine.binaryMessenger];
[channel setMessageHandler:^(id _Nullable message, FlutterReply _Nonnull callback) {
//接收来自flutter的消息
}];
[channel sendMessage:@{}];//发送给flutter的消息
//flutter
BasicMessageChannel channel = BasicMessageChannel("explor", StandardmessageCodec());
channel.setMessageHandler((message){
//来自App的消息
});
channel.send("-----")//发给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宿主应用提供的一个可移植运行时。Engine实现了Flutter的核心库,包括动画、图形、文件、网络I/O、访问支持、插件架构和Dart的运行时、编译工具链;
- Flutter Framework,大部分的Flutter开发者主要通过Flutter Framework交互。Framework提供了一个现代的、可交互的框架,以及一个丰富的平台、布局、基础部件的集合。
3.1.解码器
三种channel有2种解码器,解码器实际上是一种数据转换协议,iOS、Android、dart三端通用。
FlutterMessageCodec
@protocol FlutterMessageCodec
+ (instancetype)sharedInstance;
- (NSData * _Nullable)encode:(id _Nullable)message;
- (id _Nullable)decode:(NSData * _Nullable)message;
@end
FlutterMethodCodec
服务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 {
//判断类型
//写入标志位(数据类型)+数据本身
[- writeByte:]
[- writeBytes:- length:-]
}