在做Flutter开发的时候通常离不了Flutter和Native之间的通信,比如:初始化Flutter时Native向Dart传递数据,Dart调用Native的相册选择图片,Dart调用Native的模块进行一些复杂的计算,Native将一些数据(GPS信息,陀螺仪,传感器等)主动传递给Dart等。
接下来我将分场景来介绍Dart和Native之间的通信。
几种通信场景:

在讲解 Flutter 与 Native 之间是如何传递数据之前,我们先来了解下 Flutter 与 Native 的通信机制,Flutter 和 Native 的通信是通过Channel来完成的。
消息使用Channel(平台通道)在客户端(UI)和主机(平台)之间传递,如下图所示:

Flutter中消息的传递是完全异步的;
| Dart | Android | iOS |
|---|---|---|
| null | null | nil (NSNull when nested) |
| bool | java.lang.Boolean | NSNumber numberWithBool: |
| int | java.lang.Integer | NSNumber numberWithInt: |
| int, if 32 bits not enough | java.lang.Long | NSNumber numberWithLong: |
| double | java.lang.Double | NSNumber numberWithDouble: |
| String | java.lang.String | NSString |
| Uint8List | byte[] | FlutterStandardTypedData typedDataWithBytes: |
| Int32List | int[] | FlutterStandardTypedData typedDataWithInt32: |
| Int64List | long[] | FlutterStandardTypedData typedDataWithInt64: |
| Float64List | double[] | FlutterStandardTypedData typedDataWithFloat64: |
| List | java.util.ArrayList | NSArray |
| Map | java.util.HashMap | NSDictionary |
持续通信,收到消息后可以回复此次消息,如:Native将遍历到的文件信息陆续传递到Dart,再比如:Flutter将从服务端陆陆续获取到信息交个Native加工,Native处理完返回等;一次性通信:如Flutter调用Native拍照;持续通信,收到消息后无法回复此次消息;通过长用于Native向Dart的通信,如:手机电量变化,网络连接变化,陀螺仪,传感器等;这三种类型的类型的Channel都是全双工通信,即A <=> B,Dart可以主动发送消息给platform端,并且platform接收到消息后可以做出回应,同样,platform端可以主动发送消息给Dart端,dart端接收数后返回给platform端。