前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter调用平台代码

Flutter调用平台代码

作者头像
flyou
发布2019-08-06 17:10:04
2.1K0
发布2019-08-06 17:10:04
举报
文章被收录于专栏:flutter开发者flutter开发者

前言


在前面的文章中我们讲了许多Flutter中的组件和Flutter中的特定操作,但是单单使用Flutter里的组件和方法是不够的。

就像以前我们讲到文件存储、数据库操作单单靠使用Flutter我们是不能完成的,因为这些数据最终需要存储在特定的终端平台上,我们需要通过特点的代码来实现与特点的平台交互,所以我们引入了第三方库来完成这些操作。

当然,这些第三方库帮我们实现了与不同平台交互的代码,所以我们不需要自己再去自己去编写这些与特定平台交互的代码。

当时我们你不可能一直使用人家的第三方库啊,一些特定的功能是没人能帮你的,所以我们还是很有必要来学习下如何跟特定的平台交互的

原谅我不会Object C ,不会Ios开发,这里仅仅以Android为例来做今天的例子

平台通道


Flutter使用了一个灵活的系统,允许您调用特定平台的API,无论在Android上的Java或Kotlin代码中,还是iOS上的ObjectiveC或Swift代码中均可用。

Flutter平台特定的API支持不依赖于代码生成,而是依赖于灵活的消息传递的方式

应用的Flutter部分通过平台通道(platform channel)将消息发送到其应用程序的所在的宿主(iOS或Android)。

宿主监听的平台通道,并接收该消息。然后它会调用特定于该平台的API(使用原生编程语言) - 并将响应发送回客户端,即应用程序的Flutter部分。

用平台通道在客户端(Flutter UI)和宿主(平台)之间传递消息,如下图所示:

在客户端,MethodChannel 可以发送与方法调用相对应的消息。 在宿主平台上,MethodChannel 在Android((API) 和FlutterMethodChannel iOS (API) 可以接收方法调用并返回结果。

接下来我们来个例子看看

调用Android平台Toast


在自前面我们可以很清楚的看到在Android平台我们需要借助于MethodChannel来与Android平台代码交互。我们通过代码来讲解下如何使用

代码语言:javascript
复制

首先我们需要在我们的Dart代码中定义我们的想要调用的通道

代码语言:javascript
复制

当然这个频道的名字是可以自己定义的的,但是必须要要和一会在Android MainActivity中使用的一致。

然后,我们同个通道来调用在Android平台定义的方法

代码语言:javascript
复制

使用platform.invokeMethod(“showToast”,{“msg”:msg})来调用我们在Android平台定义的“showToast”方法

接下来,我们来看下我们在Android Activity做了哪些事情

代码语言:javascript
复制

首先我们也定义了一个跟dart文件中一样的”com.flyou.test/android”

然后我们创建了一个MethodChannel对象并对回调多了处理

当回调中参数的method方法和我们在dart中定义的一样时,我们就调用Android平台的Toast方法弹出吐司,如果msg为空则弹出toast text must not null的吐司。

当我们点击flutter程序中的按钮时,就会触发调用Android系统的Toast回调。

看下效果:

从Android平台获取数据


和上面的类似,我们可以调用系统的方法,我们同样刻印调用我们自己写的方法并且返回调用方法的值,那么我们还是举个例子看下吧。

我们通过flutter调用Android平台的方法获取当前格式化好的时间。

同样的我们还是用用和刚才一样的通道,只不过这一次我们需要更改我们调用的方法即可。

代码语言:javascript
复制

我们使用一个泛型为String的Future对象来接收Androd平台传来的字符串信息。然后调用then来显示字符串。

在MainActivity中我们定义一个getCurrentTime的方法,当触发方法名为getAndroidTime时调用改方法并返回给Flutter调用处。

代码语言:javascript
复制

下面就是效果了:

获取系统回调与监听


在前面的Flutter与平台的交互图上我们可以看到,使用MethodChannel可以调用原生平台的方法,在上面的例子中我们呢也给大家演示了如何使用,但是我们如何获取原生平台的监听与回调呢?类似于Android中的广播我们如何在Flutter接收到呢?

下面我们就需要来看下EventChannel了,借助于EventChannel(事件通道)我们可以很轻易的接收平台事件监听的回调。

那么我们还是举个例子,以Android平台网络变化为例,每当网络变化时就会触发Android本地的广播,然后通过EventChannel通知给Flutter组件中,这时候只要我们在Flutter注册相应的EventChannel就可以实现对网络变化事件的监听。

下面我们首先看下ManActivity方法中是怎么做的

代码语言:javascript
复制

在MainActivity中我们做了三件事件:

第一件事,跟上面的一样,让用户可以通过自己去触发操作判断当前网络是否可用,当然还是通过MethodChannel来实现的,然后把网络连接的状态通过我们刚才实现的Toast来弹出来。

当然这件事我们可以不做,只做监听也是可以的

代码语言:javascript
复制

第二件事,我们构造了一个动态广播接受者,来处理网络变化的广播事件,当接收到广播时判断网络状态并返回给Flutter中

代码语言:javascript
复制

第三件事,我们新建了EventChannel对象来对广播进行注册于解注册操作,负责广播的管理,并且声明注册广播的过滤器ConnectivityManager.CONNECTIVITY_ACTION,意思就是只接受网络状态变化的广播。

同样的我们定义了一个NET_CHANGE_CHANNEL通道。

代码语言:javascript
复制

在Flutter中我们需要注册对广播事件的监听并处理传来的事件即可。

代码语言:javascript
复制

在Flutter中我们使用了StatefulWidget在构建组件,使得获取到系统网络变化时可以及时更新界面UI状态。

具体的流程如下:

首先我们声明了跟MainActivity中一样的方法通道和事件通道来调用系统的方法接收系统的广播回调。

其次,我们完成对方法的注册于事件广播的注册

可以看到 eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError) 回调事件我们单独写成方法来处理。

最后,当系统广播触发时,我们通过事件通过或者方法通道来将事件并更新界面上按钮的状态。

我们还是来看下效果:

小结


  • 我们可以通过MethodChannel来调用系统平台的方法
  • 我们可以使用EventChannel来处理系统平台的监听或回调
  • 不同平台(Ios、Android)需要单独的代码去实现相应的功能

点击左下角阅读原文,体验更佳阅读效果

我怀疑这个是个坏掉的二维码,分享到朋友圈试试?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 平台通道
  • 调用Android平台Toast
  • 从Android平台获取数据
  • 获取系统回调与监听
  • 小结
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档