美文网首页
Flutter Platform Channel 浅析

Flutter Platform Channel 浅析

作者: 曾大稳丶 | 来源:发表于2022-12-05 15:47 被阅读0次

背景

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 namePlatform Channel 的名称。

  • MessageCodec<T> codec:二进制数据的编解码器。Platform Channel 内部使用 BinaryMessenger 进行 FlutterNative 的数据传输,通过编解码器,将发送的类型数据转为二进制数据,接收的二进制数据转为我们需要的类型数据。

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 ChannelMessageCodec

Platform Channel 的设计非常的棒,可以看到非常好的设计思路,值得我们学习。比如 MethodChannel ,从命名上来看,是针对函数调用的一个通讯;从职责上来看很单一,就是用于通讯告知执行那个函数(单一职责);从扩展上来看,对外开放需要通讯的BinaryMessenger(多引擎有不同的BinaryMessenger),数据编解码器 MessageCodec(依赖倒置原则,接口隔离原则);从实现上来看,内部自己进行了实现,并没有其他多余的耦合;从使用上来看,开发者关注的也很简单纯粹(最少知道原则)。

相关文章

网友评论

      本文标题:Flutter Platform Channel 浅析

      本文链接:https://www.haomeiwen.com/subject/dqkifdtx.html