BinaryMessenger
从底层的角度来看,Flutter和Native 端通信的方式是发送异步的二进制资讯,其中BinaryMessenger
是两端通信的工具,使用的资料格式为二进制格式数据
BinaryMessenger
在Android 端是一个接口,其具体实现为
FlutterNativeView
,在使用上会由MainActivity
去继承FlutterActivity
并实作在iOS 端是一个协议
FlutterBinaryMessenger
,FlutterViewController
遵守并实现了这个协议,使用上由AppDelegate
去继承FlutterAppDelegate
并实作
Channel
为了区分不同用途的讯息,每个讯息都可以为其指定一个Channel
,且当我们初始化一个Channel,实际上会在BinaryMessenger
中生成一个与之对应的MessageHandler
,并以channel name 为key,建立在BinaryMessenger
中(Map<String, MessageHandler> _handlers
),即每个Channel
只会对应一个MessageHandler
,後设定的也会将之前的覆盖掉
接下来讯息就会透过建立的MessageHandler
来处理
MessageHandler
讯息会透过建立的MessageHandler
来处理,在MessageHandler
中最後的讯息回覆动作是必须的,每个讯息的发送都应该对应一个异步的讯息回覆,即使没有返回值也必须回覆null
,这是为了使得Dart 中的Future
和Native 端的回调函数得以完成和执行
在Native 端讯息的发送和回覆都必须在主线程进行(即UI线程),而在Flutter 端,每个Dart isolate 只有一个线程,所以不用担心用错线程所导致的问题
编解码器:Codec
前两点使我们能够在Flutter 和平台间进行相互通信,但是收发的数据都是二进制的,因此,Flutter 提供了编解码器Codec
,用於高级资料类型(字符串,map等)和二进制数据(byte)之间的转换,即消息的序列化和反序列化,这样我们在写程序时就不用直接对二进制数据进行操作,其中Flutter 定义了四种基本的讯息编解码器类型:BinaryCodec、StringCodec、JSONMessageCodec、StandardMessageCodec,其中StandardMessageCodec
是Flutter Platform channel 的预设的编解码器,以下列出StandardMessageCodec
能处理的资料类型和在各平台对应的类型:
Dart | Java | Kotlin | OC | Swift | |
---|---|---|---|---|---|
null | null | null | nil (NSNull when nested) | nil | |
bool | java.lang.Boolean | Boolean | NSNumber numberWithBool: | NSNumber(value: Bool) | |
int | java.lang.Integer | Int | NSNumber numberWithInt: | NSNumber(value: Int32) | |
int, if 32 bits not enough | java.lang.Long | Long | NSNumber numberWithLong: | NSNumber(value: Int) | |
double | java.lang.Double | Double | NSNumber numberWithDouble: | NSNumber(value: Double) | |
String | java.lang.String | String | NSString | String | |
Uint8List | byte[] | ByteArray | FlutterStandardTypedData typedDataWithBytes: | FlutterStandardTypedData(bytes: Data) | |
Int32List | int[] | IntArray | FlutterStandardTypedData typedDataWithInt32: | FlutterStandardTypedData(int32: Data) | |
Int64List | long[] | LongArray | FlutterStandardTypedData typedDataWithInt64: | FlutterStandardTypedData(int64: Data) | |
Float64List | double[] | DoubleArray | FlutterStandardTypedData typedDataWithFloat64: | FlutterStandardTypedData(float64: Data) | |
List | java.util.ArrayList | List | NSArray | Array | |
Map | java.util.HashMap | HashMap | NSDictionary | Dictionary |
ServicesBinding
主要负责 Flutter 端 与 Native 端之间的资讯传递
ServicesBinding
在初始化的 initInstances
函式中主要有两个操作,将window.onPlatformMessage
与 defaultBinaryMessenger.handlePlatformMessage
关联起来,而 defaultBinaryMessenger
就是 flutter 与 native 之间进行讯息传递的关键,它负责在二者之间提供接收、传送资料的介面,它提供了send
、setMessageHandler
这两个函式,分别用於传送资料、处理资料,flutter 上层的 BasicMessageChannel
、MethodChannel
、EventChannel
等都是基於它实现的
看了好几天的 Next.js 介绍,是不是想要开始做个小专案,试试 Next.js 呢?我今天做了小...
昨天在文章中提到如何 Dockerize 你的专案,而设定你自己的 Docker Image 就是一...
27 - First non-repeating character Don't say so mu...
Q: 说好的文字Loading呢? A: 客倌这里上菜罗~ 前几篇的Loading都是以图案循环为...
大家好,距离完赛越来越近了,过完最後一天的双十连假,心情也开始忧郁了QQ,还好本系列复杂的文章差不多...