iOS Channel原理
Flutter
提供了三种Channel
用作Flutter与iOS原生平台之间的数据传递:
FlutterBasicMessageChannel
用作字符串和半结构化的数据传递。
1、结构化数据:包括预定义的数据类型、 格式和结构的数据, 常见的比如关系型数据库中数据表里的数据。
2、半结构化数据:具有可识别的模式并可以解析的文本数据文件, 比如XML数据文件。
3、非结构化数据:没有固定结构的数据, 通常保存为不同类型的文件, 比如文本文档、 图片、 视频等。
FlutterMethodChannel
用来调用方法(method invocation),包括从Flutter向原生平台发起方法调用,也支持从原生平台向Flutter发起方法调用
FlutterEventChannel
用来支持数据流(streams)通信
三种Channel分别带来不同的作用。但是在设计上大同小异。都有以下三个成员变量:
-
name:Channel
名称
作为每个Channel的唯一标志。
在我们的Flutter应用中,通常会存在多个Platform Channel。那么这些Channel之间就是通过唯一标志name来区分。例如,使用FlutterMethodChannel发起方法调用时,就需要我们为MethodChannel指定对应的标示name。
-
messenger:
消息信使(BinaryMessenger)
用作消息的发送和接收的工具,主要负责Flutter与原生之间的相互通讯。
通俗来讲,messenger就是咱们现在的外卖小哥。messenger负责把数据从Flutter送到iOS平台,或者从iOS传输数据到Flutter。尽管Flutter中存在三种不同用途的Channel,但是对应的沟通工具都是BinaryMessenger。”
-
Codec
(编解码器)
在Channel中,messenger携带的数据需要在Dart层,Native(iOS/Android平台)层中传输,所以就需要一种与平台无关的数据协议。既能支持图片,又能支持文件等资源。因此官方最终采用了二进制字节流作为数据传输协议。
二进制字节流:发送方需要把数据编码成二进制数据,接收方再把数据解码成原始数据。而负责编解码操作的就是Codec。