加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

一篇看懂Android与Flutter之间的通信

发布时间:2019-06-26 06:43:35 所属栏目:业界 来源:Android高级架构师
导读:Flutter作为一种跨平台办理方案,常常会作为一个模块嵌入到原生Android与iOS应用中,Flutter与Android原生端的通讯必不行少。以是本文就来报告一下Android怎样与flutter举办通讯。 1、架构概述 动静通过平台通道在native(host)与flutter(client)之间转达,
副问题[/!--empirenews.page--]

Flutter作为一种跨平台办理方案,常常会作为一个模块嵌入到原生Android与iOS应用中,Flutter与Android原生端的通讯必不行少。以是本文就来报告一下Android怎样与flutter举办通讯。

1、架构概述

动静通过平台通道在native(host)与flutter(client)之间转达,如下图所示:

一篇看懂Android与Flutter之间的通讯

为了确保用户界面可以或许正确相应,动静都是以异步的方法举办转达。无论是native向flutter发送动静,照旧flutter向native发送动静。

在flutter中,MethodChannel可以发送与要领挪用相对应的动静。在native平台上,MethodChannel在Android可以吸取要领挪用并返回功效。这些类可以辅佐我们用很少的代码就能开拓平台插件。

留意:本节内容来自flutter官网,读者可自行查阅。

2、平台通道数据范例支持和编解码器

平台通道可以行使提供的编解码器对动静举办编解码,这些编解码器支持简朴相同JSON的值的高效二进制序列化,譬喻布尔值,数字,字符串,字节缓冲区以及这些的列表和映射。当你发送和吸取值时,会自动对这些值举办序列化和反序列化。

下表表现了如安在平大驾吸取Dart值,反之亦然:

一篇看懂Android与Flutter之间的通讯

关于编解码器,Android端提供了以下几种。

  1. BinaryCodec:是最简朴的一种编解码器,其返回值范例与入参的范例沟通,均为二进制名目(ByteBuffer)。因为BinaryCodec在编解码进程中什么都没做,只是原封不动的将二进制数据返回。以是转达的数据在编解码时会免于拷贝,这种方法在转达的数据量较量大时很有效。好比从Android侧传入一张图片到Flutter侧表现。
  2. StandardMessageCodec:是BasicMessageChannel的默认编解码器,支持基本数据范例、列表及字典等。在编码时会先将数据写入到ByteArrayOutputStream流中,然后再将该流中的数据写入到ByteBuffer中。在解码时,直接从ByteBuffer中读取数据。
  3. StandardMethodCodec:是基于StandardMessageCodec的封装。是MethodChannel与EventChannel的默认编解码器。
  4. StringCodec:是用于字符串与二进制数据之间的编解码,其编码名目为UTF-8。在编码时会将String转成byte数组,然后再将该数组写入到ByteBuffer中。在解码时,直接从ByteBuffer中读取数据
  5. JSONMessageCodec:内部挪用StringCodec来实现编解码。
  6. JSONMethodCodec:基于JSONMessageCodec的封装。可以在MethodChannel与EventChannel中行使。

ByteBuffer是Nio中的一个类,顾名思义——就是一块存储字节的地区。它有两个实现类——DirectByteBuffer与HeapByteBuffer,DirectByteBuffer是直接在内存中开发了一块地区来存储数据,而HeapByteBuffer是在JVM堆中开发一块地区来存储数据,以是要想数据在DirectByteBuffer中与HeapByteBuffer互通,就必要举办一次拷贝。

3、通讯方法

前面讲了Android与flutter通讯的一些基本常识,下面就进入正题,来看Android怎样与flutter举办通讯。

Android与Flutter之间的通讯共有四种实现方法。

  1. 因为在初始化flutter页面时会转达一个字符串——route,因此我们就可以拿route来做文章,转达本身想要转达的数据。该种方法仅支持单向数据转达且数据范例只能为字符串,无返回值。
  2. 通过EventChannel来实现,EventChannel仅支持数据单向转达,无返回值。
  3. 通过MethodChannel来实现,MethodChannel支持数据双向转达,有返回值。
  4. 通过BasicMessageChannel来实现,BasicMessageChannel支持数据双向转达,有返回值。

下面就来看一下这几种方法的行使。

3.1、初始化时传值

首要是操作了建设flutter页面转达的route来做文章,笔者以为该种方法属于取巧,但照旧可以用来转达数据。它的行使很简朴,代码如下。

起首来看Android代码。

  1. //第三个参数可以换成我们想要字符串。 
  2. FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route"); 

在flutter中,我们只必要通过下面代码来获取值即可。

  1. void main() => runApp(MyApp( 
  2.  initParams: window.defaultRouteName, 
  3.  )); 
  4. class MyApp extends StatelessWidget { 
  5.  final String initParams;//既是前面转达的值——route 
  6.  MyApp({Key key, @required this.initParams}) : super(key: key); 
  7.  @override 
  8.  Widget build(BuildContext context) {...} 

通过该种方法就可以在初始化flutter时,Android给flutter转达数据。因为runApp仅会挪用一次,以是该种方法只能转达一次数据且数据只能是字符串。

  • 行使window的相干API必要导入包dart:ui

3.2、EventChannel

EventChannel是一种native向flutter发送数据的单向通讯方法,flutter无法返回任何数据给native。首要用于native向flutter发送手机电量变革、收集毗连变革、陀螺仪、传感器等。它的行使方法如下。

起首来看Android代码。

  1. public class EventChannelPlugin implements EventChannel.StreamHandler { 
  2.  private static final String TAG = EventChannelPlugin.class.getSimpleName(); 
  3.  private EventChannel.EventSink eventSink; 
  4.  private Activity activity; 
  5.  static EventChannelPlugin registerWith(FlutterView flutterView) { 
  6.  EventChannelPlugin plugin = new EventChannelPlugin(flutterView); 
  7.  new EventChannel(flutterView, "EventChannelPlugin").setStreamHandler(plugin); 
  8.  return plugin; 
  9.  } 
  10.  private EventChannelPlugin(FlutterView flutterView) { 
  11.  this.activity = (Activity) flutterView.getContext(); 
  12.  } 
  13.  void send(Object params) { 
  14.  if (eventSink != null) { 
  15.  eventSink.success(params); 
  16.  } 
  17.  } 
  18.  void sendError(String str1, String str2, Object params) { 
  19.  if (eventSink != null) { 
  20.  eventSink.error(str1, str2, params); 
  21.  } 
  22.  } 
  23.  void cancel() { 
  24.  if (eventSink != null) { 
  25.  eventSink.endOfStream(); 
  26.  } 
  27.  } 
  28.  //第一个参数为flutter初始化EventChannel时返回的值,仅此一次 
  29.  @Override 
  30.  public void onListen(Object o, EventChannel.EventSink eventSink) { 
  31.  this.eventSink = eventSink; 
  32.  Log.i(TAG, "eventSink:" + eventSink); 
  33.  Log.i(TAG, "Object:" + o.toString()); 
  34.  Toast.makeText(activity, "onListen——obj:" + o, Toast.LENGTH_SHORT).show(); 
  35.  } 
  36.  @Override 
  37.  public void onCancel(Object o) { 
  38.  Log.i(TAG, "onCancel:" + o.toString()); 
  39.  Toast.makeText(activity, "onCancel——obj:" + o, Toast.LENGTH_SHORT).show(); 
  40.  this.eventSink = null; 
  41.  } 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读