| 
                         BasicMessageChannel是一种能够在native与flutter之间互相发送消息的通信方式,它支持数据类型最多,使用范围最广。EventChannel与MethodChannel的应用场景可以使用BasicMessageChannel来实现,但BasicMessageChannel的应用场景就不一定能够使用EventChannel与MethodChannel来实现。该方式有返回值。它的使用方式如下。 
首先来看Android代码的实现。 
- //这里支持的数据类型为String。 
 - public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> { 
 -  private Activity activity; 
 -  private BasicMessageChannel<String> messageChannel; 
 -  static BasicMessageChannelPlugin registerWith(FlutterView flutterView) { 
 -  return new BasicMessageChannelPlugin(flutterView); 
 -  } 
 -  private BasicMessageChannelPlugin(FlutterView flutterView) { 
 -  this.activity = (Activity) flutterView.getContext(); 
 -  this.messageChannel = new BasicMessageChannel<String>(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE); 
 -  messageChannel.setMessageHandler(this); 
 -  } 
 -  @Override 
 -  public void onMessage(String s, BasicMessageChannel.Reply<String> reply) { 
 -  reply.reply("BasicMessageChannelPlugin收到:" + s); 
 -  if (activity instanceof FlutterAppActivity) { 
 -  ((FlutterAppActivity) activity).showContent(s); 
 -  } 
 -  } 
 -  void send(String str, BasicMessageChannel.Reply<String> reply) { 
 -  messageChannel.send(str, reply); 
 -  } 
 - } 
 
  
笔者对Android端代码做了一个简单的封装,还是很好理解的。下面就来看flutter代码实现。 
- class _MyHomePageState extends State<MyHomePage> { 
 -  //StringCodec()为编码格式 
 -  BasicMessageChannel<String> _basicMessageChannel = 
 -  BasicMessageChannel("BasicMessageChannelPlugin", StringCodec()); 
 -  @override 
 -  void initState() { 
 -  _basicMessageChannel.setMessageHandler((message) => Future<String>(() { 
 -  print(message); 
 -  //message为native传递的数据 
 -  setState(() { 
 -  _content = message; 
 -  }); 
 -  //给Android端的返回值 
 -  return "收到Native消息:" + message; 
 -  })); 
 -  _controller = TextEditingController(); 
 -  super.initState(); 
 -  } 
 -  //向native发送消息 
 -  void _sendToNative() { 
 -  Future<String> future = _basicMessageChannel.send(_controller.text); 
 -  future.then((message) { 
 -  _resultContent = "返回值:" + message; 
 -  }); 
 -  } 
 -  @override 
 -  Widget build(BuildContext context) {...} 
 - } 
 
  
上面就是通过BasicMessageChannel来进行通信的代码实现。在Android端只需要调用BasicMessageChannelPlugin的send方法就可以向flutter发送数据,BasicMessageChannel.Reply是返回值的回调方法。在flutter端使用只需要参考_sendToNative方法的实现即可。 
4、通信原理 
从分析Android与Flutter通信的源码来看,实现还是比较简单的,都是以ByteBuffer为数据载体,然后通过BinaryMessenger来发送与接收数据。整体设计如下。 
  
从图中可以看出,Android侧与flutter侧采用了相同的设计。前面说过通信时是异步进行的,那么线程切换在哪?其实是在系统底层实现的。在Android与Flutter通信中,系统底层屏蔽了线程切换、数据拷贝等大量复杂操作。使得Android侧与flutter侧能方便的来进行通信。 
                        (编辑:我爱故事小小网_铜陵站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |