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

Flutter调用平台代码

作者头像
flyou
发布于 2019-08-06 09:10:04
发布于 2019-08-06 09:10:04
2.2K00
代码可运行
举报
文章被收录于专栏:flutter开发者flutter开发者
运行总次数:0
代码可运行

前言


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

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

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

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

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

平台通道


Flutter使用了一个灵活的系统,允许您调用特定平台的API,无论在Android上的JavaKotlin代码中,还是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
代码运行次数:0
运行
复制

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

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

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

看下效果:

从Android平台获取数据


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

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

代码语言:javascript
代码运行次数:0
运行
复制

下面就是效果了:

获取系统回调与监听


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

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

代码语言:javascript
代码运行次数:0
运行
复制

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

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

代码语言:javascript
代码运行次数:0
运行
复制

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

代码语言:javascript
代码运行次数:0
运行
复制

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

具体的流程如下:

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

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

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

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

我们还是来看下效果:

小结


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

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

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
1.2-Air302(NB-IOT)-下载和运行第一个程序
12.增加脚本,选择lib 里面的 mqtt.lua 和 sys.lua (这是必须的文件)
杨奉武
2020/09/15
7200
1.2-Air302(NB-IOT)-下载和运行第一个程序
0.A1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn-NB-IOT-Air302-ForLua" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/05/18
8020
0.A1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板)
1.1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板+配套底板)
首先需要在终端输入:sudo apt install python3-pip (如果系统已经安装过了pip,就不需要这一步了)
杨奉武
2021/12/01
5950
1.1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板+配套底板)
3.4-Air302(NB-IOT)-网络通信-MQTT通信(本机安装MQTT+花生壳映射),MQTT文件封装
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn-NB-IOT-Air302-ForLua" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2020/12/31
9160
GPRS(Air202) Lua开发: GPIO输出高低电平
如果设置GPIO0 - GPIO31管脚,则第一个参数填写 pio.P0_0 - pio.P0_31
杨奉武
2020/05/25
9180
GPRS(Air202) Lua开发: GPIO输出高低电平
在LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202和ESP8266的LUA程序
咱们用LUA开发 Air202或者ESP8266的时候是不是都希望可以直接升级lua文件
杨奉武
2020/04/27
1.1K0
在LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202和ESP8266的LUA程序
05-STM32+ESP8266+AIR202/302基本控制篇-功能3-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
1.随着2G基站撤销和不再维护,对于低速,小数据量场合的通信由另一个GPRS模组代替(NB-IOT)
杨奉武
2020/09/19
9890
STM32+ESP8266+AIR202/302基本控制篇-47-功能测试-STM32+Air302(NB-IOT)+Mdebtls使用SSL单向认证方式连接MQTT服务器(不校验服务器证书)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/03/04
7900
STM32+ESP8266+AIR202/302基本控制篇-47-功能测试-STM32+Air302(NB-IOT)+Mdebtls使用SSL单向认证方式连接MQTT服务器(不校验服务器证书)
2-STM32+ESP8266+AIR202基本控制篇-整体运行测试-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/07/29
5220
2-STM32+ESP8266+AIR202基本控制篇-整体运行测试-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
0-STM32+ESP8266+Air302基本控制篇(自建物联网平台)-整体运行测试-微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
这节测试一下微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和模组实现远程通信控制
杨奉武
2022/04/29
5420
0-STM32+ESP8266+Air302基本控制篇(自建物联网平台)-整体运行测试-微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
AIR平台应用
前面的章节中我们学习了Flex的常用控件,Flex与外部通信 ,Cairmgorm框架的使用。到目前位置,我们所创建的Flex应用都是部署到Web服务器上,通过安装在浏览器中的Flash Player运行。事实上Flex应用程序也可以部署成为桌面应用程序,Flex桌面应用程序运行于AIR平台上,AIR相当于AIR应用程序的虚拟机,在应用程序和用户操作系统之间提供一层接口。AIR是AIR应用程序只需要编写一次就可以跨平台运行。
张哥编程
2024/12/17
1680
004-ESP32学习开发(SDK)-新建工程模板和创建新的文件
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/05/11
2.1K0
004-ESP32学习开发(SDK)-新建工程模板和创建新的文件
lua
数学库由算术函数的标准集合组成,比如三角函数库(sin, cos, tan, asin, acos, etc.), 幂指函数(exp, log, log10),舍入函数(floor, ceil)、max、min,加上一个变量 pi。数学 库也定义了一个幂操作符(^)。 所有的三角函数都在弧度单位下工作。(Lua4.0 以前在度数下工作。)你可以使用 deg 和 rad 函数在度和弧度之间转换。
radaren
2018/08/28
2.3K0
Nginx Lua扩展模块
淘宝开发的 ngx_lua 模块通过将 Lua 解释器集成进 Nginx,可以采用 Lua 脚本实现业务逻辑,由于 Lua 的紧凑、快速以及内建协程,所以在保证高并发服务能力的同时极大地降低了业务逻辑实现成本。
用户9615083
2022/12/25
3.7K0
Nginx Lua扩展模块
lua--数据类型、变量、循环、函数、运算符的使用
lua是一种轻量级脚本语言,由c语言编写,设计lua的初衷是为了:嵌入到应用程序中,提供灵活的扩展和定制化功能 lua官网:https://www.lua.org/ 可以从中下载安装lua
aruba
2022/06/22
1.4K0
lua--数据类型、变量、循环、函数、运算符的使用
lua实例教程_lua教程网
1.进入Lua官网:http://www.lua.org——下载Lua 2.下载文件【 lua-5.3.4_Win64bin.zip 】 3.创建一个空文件夹“Lua”并在其中解压【 lua-5.3.4_Win64bin.zip 】压缩文件 4.复制“Lua”文件夹到一个不会被删除的地方, 5.路径最好不要是中文。( 推荐选择C盘 ) 6.将此路径加入到环境变量中 7.cmd 中输入lua 查看安装是否成功
全栈程序员站长
2022/11/01
2K0
lua实例教程_lua教程网
SQL注入从入门到进阶
本文章产生的缘由是因为专业老师,让我给本专业的同学讲一哈SQL注入和XSS入门,也就是本文的入门篇,讲完两节课后,发现自己对于SQL注入的理解也就仅仅局限于入门,于是有了进阶章节的产生。
小简
2022/12/29
4K0
SQL注入从入门到进阶
Lua 5.1 参考手册
Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。 Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。 它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)
sunsky
2020/08/20
4.1K0
Lua 语法基础 | Nmap 脚本
and break do else elseif end false goto for function if in local nil not or repeat return then true until while
意大利的猫
2020/08/20
2.1K0
Pikachu漏洞平台通关记录
开始复习最基础的Web漏洞,查漏补缺,打好基础,我也尽量把文章写得详细一些,希望对刚入门的小白能有一些帮助。
小简
2023/01/01
2.9K0
Pikachu漏洞平台通关记录
推荐阅读
相关推荐
1.2-Air302(NB-IOT)-下载和运行第一个程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档