通讯方式
MethodChannel ) 这是 Flutter 与原生平台通信的主要方式。,让 Flutter 端的 Dart 代码可以调用原生平台的代码,原生平台的代码也可以调用Flutter的方法
BasicMessageChannel 信息通道 向原生平台传递各种类型的数据,从原生平台接收各种类型的数据
EventChannel 事件通道 (Event Channel) 事件通道允许原生平台向 Flutter 发送数据流。Flutter 端可以监听这个数据流并获取原生端发送的数据
异同
同
- 全局定义唯一的
Name
与原生平台对应。 - 使用
codec
编码解码器对要传递的信息进行编码解码 - 用
binaryMessenger
实现消息的传递和接收
例:在 BasicMessageChannel
send方法中codec.encodeMessage
将要发送的数据进行编码传入binaryMessenger#send
中 , codec.decodeMessage
用来解码 binaryMessenger#send
方法返回的值。
dart
// BasicMessageChannel<T>
Future<T?> send(T message) async {
return codec.decodeMessage(await binaryMessenger.send(name, codec.encodeMessage(message)));
}
异
codec
不一样binaryMessenger
不一样
BasicMessageChannel
BasicMessageChannel
使用的 codec
类型是抽象类 MessageCodec
类编码解码器 ,主要针对 String,double,int 等一些基础类型的数据进行编码解码。 在Flutter中有MessageCodec
的四个实现类,分别对应不同情况下的数据解码编码的使用。
JSONMessageCodec
StandardMessageCodec
StringCodec
BinaryCodec
MethodChannel
MethodChannel
使用的 codec
类型是抽象类MethodCodec
类编码解码器,在Flutter中有MethodCodec
的两个实现类
StandardMethodCodec
JSONMethodCodec
MethodChannel
的 codec
默认为 StandardMethodCodec
MethodChannel#_invokeMethod
方法中
EventChannel
EventChannel
和 MethodChannel
一样默认使用的是 StandardMethodCodec
EventChannel #receiveBroadcastStream
方法中
EventChannel的 本质是通过 MethodChannel#invokeMethod(方法通道调用listen ,通过setMessageHandler 监听回调把内容通过StreamController #添加返回一个Stream),完成原生单向向Flutter传递信息
BinaryMessenger
BinaryMessenger
是一个信使抽象类
在原生通讯的三种方式 用了 BinaryMessenger的三个实现类
_DefaultBinaryMessenger
_ProfiledBinaryMessenger
BackgroundIsolateBinaryMessenger
在 EventChannel的类中会通过 _findBinaryMessenger
方法来为 _binaryMessenger
赋值 ,不是web平台会使用
BackgroundIsolateBinaryMessenger
作为信使 否则使用 _DefaultBinaryMessenger
javascript
BinaryMessenger _findBinaryMessenger() {
return !kIsWeb && ServicesBinding.rootIsolateToken == null
? BackgroundIsolateBinaryMessenger.instance
: ServicesBinding.instance.defaultBinaryMessenger;
}
MethodChannel
和 BasicMessageChannel
中 会在 _findBinaryMessenger
方法得到一个BinaryMessenger
shouldProfilePlatformChannels
的判断来返回不同类型的 BinaryMessenger
。
_ProfiledBinaryMessenger 本质是不干活的 他功能的完成是通过传入的 BinaryMessenger
通过代理完成功能的实现。
BackgroundIsolateBinaryMessenger 类和 _DefaultBinaryMessenger类 都是一个单例 ,主要实现不同平台 BinaryMessenger (信使)的 send
方法和 setMessageHandler
方法
根据平台的不同使用不同的 BinaryMessenger
单例模式保证全局只有一个实例,符合通道的唯一性的需求。