Day07 Flutter 和 Native 通讯的原理 01

Flutter 和 Native 通讯的原理
  • BinaryMessenger

    从底层的角度来看,Flutter和Native 端通信的方式是发送异步的二进制资讯,其中BinaryMessenger是两端通信的工具,使用的资料格式为二进制格式数据

    BinaryMessenger

    在Android 端是一个接口,其具体实现为FlutterNativeView,在使用上会由MainActivity去继承FlutterActivity并实作

    在iOS 端是一个协议FlutterBinaryMessengerFlutterViewController遵守并实现了这个协议,使用上由AppDelegate去继承FlutterAppDelegate并实作

https://ithelp.ithome.com.tw/upload/images/20210922/20118479vVBF9IgkO6.png

  • 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 定义了四种基本的讯息编解码器类型:BinaryCodecStringCodecJSONMessageCodecStandardMessageCodec,其中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.onPlatformMessagedefaultBinaryMessenger.handlePlatformMessage 关联起来,而 defaultBinaryMessenger 就是 flutter 与 native 之间进行讯息传递的关键,它负责在二者之间提供接收、传送资料的介面,它提供了sendsetMessageHandler 这两个函式,分别用於传送资料、处理资料,flutter 上层的 BasicMessageChannelMethodChannelEventChannel 等都是基於它实现的


<<:  Day10你敢不敢给我登入

>>:  InnoDB统计资料是如何收集的

#07 简介篇 — 使用 Next.js 的各种 Data Fetching 方式实作小专案 ft. Github API

看了好几天的 Next.js 介绍,是不是想要开始做个小专案,试试 Next.js 呢?我今天做了小...

Laravel 实战经验分享 - Day26 Dockerize 你的 Laravel 专案(下)

昨天在文章中提到如何 Dockerize 你的专案,而设定你自己的 Docker Image 就是一...

见习村27 - First non-repeating character

27 - First non-repeating character Don't say so mu...

CSS微动画 - Loading来了!终於要出款文字版本的了!

Q: 说好的文字Loading呢? A: 客倌这里上菜罗~ 前几篇的Loading都是以图案循环为...

[DAY28]番外篇-使用fetch发送请求

大家好,距离完赛越来越近了,过完最後一天的双十连假,心情也开始忧郁了QQ,还好本系列复杂的文章差不多...