Flutter Channel 小结 2

434 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

Codec(编解码器)

在Flutter中有两种Codec:

messageCodec:对message进行编解码

MessageCodec用于二进制数据与基础数据之间的编解码,其中FlutterBasicMessageChannel中采用的就是该Codec。
在Flutter中,MessageCodec有多种实现:

  • FlutterStandardMessageCodec:是FlutterBasicMessageChannel中默认使用的编解码器。(底层是用FlutterStandardReaderWriter实现的)。用于数据类型和二进制数据之间的编解码。支持基础数据类型包(bool、char、double、float、int、long、short、String、Array、Dictionary)以及二进制数据。
  • FlutterBinaryCodec:用于二进制数据和二进制数据之间的编解码,在实际上只是原封不动的将接收到的二进制数据返回。
  • FlutterStringCodec:用于字符串与二进制数据之间的编解码,对于字符串采用UTF-8编码格式。
  • FlutterJSONMessageCodec:用于数据类型与二进制之间的编解码,支持基础数据类型(bool、char、double、float、int、long、short、String、Array、Dictionary)。在iOS端使用NSJSONSerialization作为序列化的工具。
FlutterMethodCodec:对FlutterMethodCall编解码

FlutterMethodCodec用于二进制数据与方法调用(FlutterMethodCall)和返回结果之间的编解码。主要用在FlutterMethodChannelFlutterEentChannel中。

FlutterMethodCall代表从Flutter端发起的方法调用。方法调用包括:方法名、方法参数以及方法返回结果。因此和FlutterMessageCodec相比,FlutterMethodCodec中多了两个处理调用结果的方法:

  • 方法调用成功:使用encodeSuccessEnvelope:编码result。
  • 方法调用失败:使用encodeErrorEnvelope:编码FlutterError。

decodeEnvolope:方法则用于解码iOS平台代码调用Dart中方法的结果。比如通过FlutterMethosdChannel调用了Flutter中的方法,且获得其返回结果。

当前在FlutterMethodCodec有两种实现:

  • FlutterJSONMethodCodecFlutterJSONMethodCodec编解码器依赖于FlutterJSONMethodCodec。在将FlutterMethodCall对象进行编码时,会首先将该对象转成JSON对象:
{
    "method":method,
    "args":args
}

其在编码调用结果时,会将其转化为一个数组,调用成功为[result],调用失败为[code,message,details]。

  • FlutterStandardMethodCodec:它是FlutterMethodCodec的默认实现。当其编码在将FlutterMethodCall对象进行编码时,会将methodargs依次使用FlutterStandardReaderWriter进行编码,然后写成二进制数据。

注意:Flutter新版本的StandardMethodCodec不再依赖StandardMessageCodecmethodargs进行编么,而是使用公共类FlutterStandardReaderWriter进行编码。