flutter互传参数,flutter数据传递

Flutter与原生通信概述

flutter与原生通信主要有三种方式:MethodChannel、EventChannel、BasicMessageChannel,这三种方式均各有适用的场景:MethodChannel用于native与flutter的方法调用,EventChannel用于native单向的向flutter发送广播消息,BasicMessageChannel用于native与flutter之间的消息互发。

站在用户的角度思考问题,与客户深入沟通,找到临洮网站设计与临洮网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站设计、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广、申请域名网站空间、企业邮箱。业务覆盖临洮地区。

MethodChannel用于双方之间的方法互调,使用步骤是:

1.创建一个MethodChannel对象,传入MethodChannel名称。

2.使用setMethodHandle对对方调用自己的方法进行监听,通过回调中的MethodCall对象方法名判断、获取方法参数,并且返回调用结果。

3.使用invokeMethod来调用对方的方法,可传入方法名,方法参数,以及监听对方的回调结果。

以下是示例:

需要注意的是,MethodChannel的名称需要双方保持一致,否则就不是同一个MethodChannel了。另外这里的方法调用并不是像Java里面反射那样去先找到class示例对象再解析到相应的方法,而是将双方互发的消息包装成了MethodCall对象,拿到这个对象后通过MethodCall里面的方法名去判断要做什么操作,并不是直接就调用了自身(native或flutter)相对应的方法。具体要做什么操作、调用什么方法还是得自己去调用和实现。

EventChannel适用于native向flutter发送广播消息,只是单向的消息发送,native发,flutter收,返过来flutter并不能向native发送消息。例如native可将定位数据不断的报给flutter,或者录像数据等等,所有基于原生能力产生的数据都可以通过EventChannel进行发送。

步骤:

1.创建一个EventChannel对象,传入EventChannel名称。

2.flutter端调用receiveBroadcastStream进行广播消息注册,传入arguments参数即为广播名称,此参数是告诉native端你要接受的广播类型,判别是什么广播发送的数据。

2.native调用setStreamHandler方法进行广播消息监听,onListen回调里会有一个arguments参数,这里及为flutter注册的广播类型,若flutter端没有注册,则native端不会收到这个回调,也就无法进行消息发送。收到flutter端的广播注册后,根据arguments可判断广播类型,然后根据EventChannel.EventSink来进行消息发送,EventSink.success()即可将消息发送给flutter端。

3.flutter进行广播注册会返回一个streamSubscription类型的对象,该对象可以进行消息的停止,native可在onCancel回调里面收到。

示例如下:

BasicMessageChannel就是比较常用的消息互发,使用步骤如下:

1.创建BasicMessageChannel对象,传入BasicMessageChannel名称。还需传入编解码方式(可以自己实现),系统提供了一些列的编解码方式,后续会介绍到。

2.使用setMessageHandler方法进行消息监听,也可进行回复。

3.使用send方法进行消息发送。

无论哪种方式的消息传递,最终都是将自定义数据转化为二进制数据进行传递,flutter提供的编解码方式分为MethodCodec和MessageCodec两种,EventChannel和MethodChannel使用的就是MethodCodec,BasicMessageChannel使用的是MessageCodec。MethodCodec其实就是在MessageCodec的基础上将数据包装了一下,使其转化为MethodCall对象方便使用。

MethodCodec源码:

MethodCodec提供了两种方式:JSONMethodCodec和StandardMethodCodec,前一种就是JSON和MethodCall对象之间的互转,后一种则是根据传入的数据基本类型(String,Integer等)来进行互转。

MessageCodec则提供了四种方式,如下图,具体就不详细讲述了,看看名字就知道是怎么回事,可以直接去看源码。最常用和默认的就是StandardMessageCodec方式。

从上面的使用方式可以看出,每一种Channel在创建的时候都需要传递一个BinaryMessenger,这个接口可以在FlutterEngine里面拿到,因此需要在FlutterActivity里面实现configFlutterEngine方法里面重写这个方法。FlutterActivity在attach FlutterEngine之后就会调用这个configFlutterEngine方法,通过flutterEngine.getPlugins().add(FlutterPlugin)方法可以FlutterPlugin的回调方法里进行数据的初始化和销毁工作。如下图

这个回调方法里的FlutterPluginBinding提供了一些我们可能会用到的对象,如下:

Flutter 与 Android 互调

在做这个小 demo 的时候,遇到了一些坑,到文章发布 坑 还是没有填好,无奈,只得用了别的方式实现了本篇文章的功能。

我这个人的缺点就是 爱钻牛角尖,哎

废话不多说,看效果图

那么,我们开始吧!

我们先看界面逻辑,先不考虑功能,然后将此布局给予上层

注意看这一行

这行其实作用就是声明了 链接 Android 原生的 MethodChannel

当然了,里面的内容随意, 你看我写的多随意

而真正的调用逻辑是

对 就是 invokeMethod 这个方法

当然这个方法的使用还有「带参数的使用方法」

再来看下方法的实现

ok,到此,Flutter 的逻辑就基本走完了,现在来看下 Android 的逻辑

这里,是我浪费了点时间的一个坑,我以为我可以直接在 Flutter 的项目结构下去更改 Android 的项目,结果证明我还是 too young 了,好了,说下我的方法,我是直接切换到了 Android 的项目结构,如下图

这样就可以进入 Android 的结构了

很简单,你想实现相互调用,那么肯定得有 暗号 吧

这里是通过

来实现的

其中 MethodCall 能够判断 Flutter 传递过来什么名称的参数,得到参数的内容等

而 MethodChannel.Result 则能够返回结果给 Flutter

上面的截图就是通过这两个类来实现的逻辑

定义依赖

定义 Bean

定义网络接口

实现 RetrofitHelper

通过 jakewharton 封装的 rxrelay 结合 rxjava2 实现 rxbus

Android Flutter 互调

MethodChannel 在 Flutter 及 Android 中的使用

Flutter 页面跳转

RxBus 封装

Bingo

谢谢小伙伴的关注、收藏、点赞,谢谢~~

自定义Plugin插件,Native和flutter传参相互交互

1 File-New Flutter Project -Flutter-next选择 project type(Android studio不同版本会有所差异)

参考链接:

2.1本地引入

这里plugin是flutter module引入使用,如果想project引用其实可以直接在.android下面创建插件

2.2远程引用

Flutter与Android通信的三种方式

一、 MethodChannel

主要是flutter端调用android方法。flutter调取android方法,也可以android主动跟flutter通信,但是这个只能是传递数据,不是调方法。MethodChannel的flutter调取android方法,我之前写过,可以查看如下链接,

Android主动跟flutter通信,如下

二、 BasicMessageChannel

它是可以双端通信的,flutter端可以给Android发送消息,Android也可以给Flutter发送消息。

三、EventChannel

只能是原生发送消息给Flutter端,例如监听手机电量变化,网络变化,传感器等。

打印结果如下:

总结一下:

MethodChannel 用于传递方法调用(method invocation),是flutter调取原生方法的,也可以原生主动传递数据给Flutter。

BasicMessageChannel 用于传递字符串和半结构化的信息。是两个端相互发送数据,接收数据的。

EventChannel 用于数据流(event streams)的通信。通长用于Nativie向flutter的通信,如:手机电量变化,网络连接变化,陀螺仪,传感器等;

tip:多种类型的通道混用可能会出现报错问题。

Flutter跨组建传递数据的三种方式

背景:flutter组件嵌套都很深,依次传递数据很麻烦,所以最好是能够跨组件传递。有三张跨组件的方式:InheritedWidget、Notification、Eventbus.

是一种自上而下的传递数据的方式。

使用步骤:

它的数据流动方式和InheritedWidget刚好相反,从子控件向上面传递。

具体使用

跟android 原生的eventbus原理和使用一样。


网页名称:flutter互传参数,flutter数据传递
URL链接:http://csdahua.cn/article/dsioeds.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流