Flutter Channel 小结 1

157 阅读3分钟

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

Flutter作为一个灵活的UI框架。无论是iOS平台上的OC或swift,还是Android平台上的Java或Kotlin都可以通过Plateform Channel机制来与Flutter进行通讯。需要注意的是Plateform Channel不依赖代码生成,而是建立在消息传递方式上。实际上,它的工作模式和原理非常类似基于二进制协议开发的网络服务。

iOS Channel原理

Flutter提供了三种Channel用作Flutter与iOS原生平台之间的数据传递:

  • FlutterBasicMessageChannel:用作字符串和半结构化的数据传递。
    • 结构化数据:包括预定义的数据类型、格式和结构的数据,常见的比如关系型数据库中数据表里的数据。
    • 半结构化数据:具有可识别的模式并可以解析的文本数据文件,比如XML数据文件。
    • 非结构化数据:没有固定结构的数据,通常保存为不同类型的文件,比如文本文档、图片、视频等。
  • FlutterMethodChannel:用来调用方法(method invocation),包括从Flutter向原生平台发起方法调用,也支持从原生平台向Flutter发起方法调用。
  • FlutterEventChannel:用来支持数据流(streams)通信。 三种Channel分别带来不同的作用。但是在设计上大同小异。都有以下三个成员变量:
1.name:Channel名称

作为每个Channel的唯一标志。

在我们的Flutter应用中,通常会存在多个Plateform Channel。那么这些Channel之间就是通过唯一标志name来区分。例如,使用FlutterMethodChannel发起方法调用时,就需要我们为MethodChannel指定对应的标示name。

2.messenger:消息信使(BinaryMessenger)

用作消息的发送和接收的工具,主要负责Flutter与原生之间的相互通讯。

通俗来说,messenger就是咱们现在的外卖小哥。messenger负责把数据从Flutter送到iOS平台,或者从iOS传输数据到Flutter。尽管Flutter中存在三种不同用途的Channel,但是对应的沟通工具都是BinaryMessenger

在创建一个Channel后,不论是通过设置代理(Delegate),还是通过setXXXXHandler:来进行消息处理,最终会为该Channel绑定一个FlutterBinaryMessageHandler。并以Channel的name为key,保存在一个Map结构中。当接收到发送消息后,会根据消息中携带的Channel名称取出对应FlutterBinaryMessageHandler,并交由BinaryMessenger处理。

注意⚠️:在iOS平台BinaryMessenger是一个名为FlutterBinaryMessenger的协议。

3.Codec(编解码器)

Channel中,messenger携带的数据需要在Dart层,Native(iOS/Android平台)层中传输,所以就需要一种与平台无关的数据协议。既能支持图片,又能支持文件等资源。因此官方最终采用了二进制字节流作为数据传输协议。

二进制字节流:发送方需要把数据编码成二进制数据,接收方再把数据解码成原始数据。而负责编解码操作的就是Codec。