参考链接:http://laomengit.com/guide/mixing/MethodChannel.html
flutter和android原生的通讯方式一共有3种,分别是:
BasicMessageChannel,MethodChannel,EventChannel
三种类型的特征:
- BasicMessageChannel:双向通信(可以主动发送信息),用于传递字符串和半结构化的信息。
- MethodChannel:双向通信,用于传递方法调用。最常用。
- EventChannel: 用于数据流的通信。只能Native主动发送数据给Flutter。
- 三种方式下Native主动发送数据给Flutter时,Native 端代码都需要在主线程中执行。
数据传输源码分析:
如何实现数据传输的:
native端发送
EventChannel
channel.setStreamHandler(this)
IncomingStreamRequestHandler(handler)
onMessage是由dart端注册之后回调过来的?
onListen-EventSinkImplementation()
success-EventChannel.this.messenger.send(name, codec.encodeSuccessEnvelope(event));
DartExecutor-binaryMessenger-DefaultBinaryMessenger-messenger.send(channel, message, callback);
-flutterJNI.dispatchPlatformMessage(channel, message, message.position(), replyId);
private native void nativeDispatchPlatformMessage
【
nativeDispatchPlatformMessage调用到了native层,是在shell\platform\android\platform_view_android_jni.cc文件中,
注册的地方:
platform_view_android_jni.cc
】
flutter端获取(消息队列)
_eventChannel.receiveBroadcastStream().listen(_onData);
receiveBroadcastStream-StreamController<dynamic>.broadcast
_AsyncBroadcastStreamController
Stream<T> get stream => new _BroadcastStream<T>(this);
_BroadcastStream<T> extends _ControllerStream<T> extends _StreamImpl<T>
[继承链条:_BroadcastStream,_ControllerStream,_StreamImpl,Stream]
_StreamImpl<T>-listen-_createSubscription-_createSubscription(_ControllerStream)-_controller._subscribe-_AsyncBroadcastStreamController._subscribe
_runGuarded(onListen);-onListen-binaryMessenger.setMessageHandler
defaultBinaryMessenger.setMessageHandler-ui.channelBuffers.drain-
【
while (!_isEmpty(channel)) {
final _StoredMessage message = _pop(channel)!;
await callback(message.data, message.callback);
}
】
handlePlatformMessage-await handler(data);-controller.add(codec.decodeEnvelope(reply));
-StandardMethodCodec.decodeEnvelope-return messageCodec.readValue(buffer);[ReadBuffer]
-_AsyncBroadcastStreamController.add-_BroadcastStreamController.add-_sendData(data);-_AsyncBroadcastStreamController._sendData
_addPending-pending.schedule(this);-handleNext(dispatch);-_StreamImplEvents.handleNext(dispatch);-event.perform(dispatch);-_DelayedData.perform
void perform(_EventDispatch<T> dispatch) {
dispatch._sendData(value);=>本身的_sendData=>_zone.runUnaryGuarded(_onData, data);
}
下面是每种通讯方式的主要代码:
BasicMessageChannel:
//flutter定义
var channel = BasicMessageChannel('channel_name', StandardMessageCodec());
//flutter发送消息到native
var result = await channel.send(T);
//flutter接收native发送的消息
channel.setMessageHandler((T) {});
//native定义
var channel = BasicMessageChannel(BinaryMessenger, "channel_name", StandardMessageCodec())
//绑定消息接收
channel.setMessageHandler(BasicMessageChannel.MessageHandler)
//native发送消息到flutter
channel.send(Any)
//native响应flutter发送
reply.reply(Any)【reply:BasicMessageChannel.Reply】
MethodChannel:
//f