flutter和native通讯的3种方式

参考链接: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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值