背景
Flutter
是目前市面上比较多人选择的一个跨平台 UI
开发框架, 跨平台肯定会涉及到和 Native
交互,比如获取屏幕宽高,获取电量信息等等。Flutter
提供了 Platform Channel
作为交互的方式。
Platform Channel 的内部主要组成
主要由如下三部分组成:
// 二进制数据的通讯抽象
@NonNull private final BinaryMessenger messenger;
// 该 Platform Channel 的名称
@NonNull private final String name;
// 协议编解码器
@NonNull private final MessageCodec<T> codec;
BinaryMessenger messenger
:为了抹平Flutter
和不同平台Native
通讯的差异(自己的理解),采用了二进制的方式进行数据传输,抽象了BinaryMessenger
用于二进制数据的发送和接收。Platform Channel
内部最终也是使用这个抽象进行数据发送和接收。String name
:Platform Channel
的名称。MessageCodec<T> codec
:二进制数据的编解码器。Platform Channel
内部使用BinaryMessenger
进行Flutter
和Native
的数据传输,通过编解码器,将发送的类型数据转为二进制数据,接收的二进制数据转为我们需要的类型数据。
MessageCodec 种类
如上所说,MessageCodec
的作用用于二进制数据和我们需要的类型数据进行编解码转换。目前官方支持类型有如下(没有列举完全):
-
MessageCodec
很简单的一个抽象定义,就是指定类型和二进制的互转。有如下几种实现:-
BinaryCodec
:不进行转换,就是二进制传递,可用于大数据传递。 -
StringCodec
:字符串和二进制的转换。 -
StandardMessageCodec
:基础类型和二进制的转换。支持null,Booleans,Bytes, Shorts, Integers, Longs,BigIntegers (see below),Floats, Doubles,Strings,byte[], int[], long[], float[], double[],Lists of supported values,Maps with supported keys and values
。 -
JSONMessageCodec
:将数据转为json
字符串,然后通过该json
字符串进行和二进制的转换。
-
-
MethodCodec
抽象了MethodCall
来表示一个函数,二进制数据和MethodCall
进行转换。-
StandardMethodCodec
:将MethodCall
数据写入二进制和接收转换。 -
JSONMethodCodec
:采用上面的JSONMessageCodec
实现,只是传递的数据是MethodCall
数据。
-
Platform Channel 种类
Platform Channel
目前有如下几种类型:
类型 | 说明 | 通讯方向 | 是否有回调 |
---|---|---|---|
BasicMessageChannel |
指定一种类型数据进行通讯 | 双向 | 是 |
MethodChannel |
指定函数调用通讯 | 双向 | 是 |
EventChannel |
用于数据流的通讯(Flutter 订阅,Native 发送) |
Native -> Flutter |
否 |
总结
Platform Channel
只是为了方便使用(开发者只需要关心发送事件和接收事件)所进行的一个封装聚拢,对外隐藏了数据发送和接收实现的细节,根据场景选择不同的 Platform Channel
和 MessageCodec
。
Platform Channel
的设计非常的棒,可以看到非常好的设计思路,值得我们学习。比如 MethodChannel
,从命名上来看,是针对函数调用的一个通讯;从职责上来看很单一,就是用于通讯告知执行那个函数(单一职责);从扩展上来看,对外开放需要通讯的BinaryMessenger
(多引擎有不同的BinaryMessenger
),数据编解码器 MessageCodec
(依赖倒置原则,接口隔离原则);从实现上来看,内部自己进行了实现,并没有其他多余的耦合;从使用上来看,开发者关注的也很简单纯粹(最少知道原则)。