在前面的文章中我们讲了许多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平台我们需要借助于MethodChannel来与Android平台代码交互。我们通过代码来讲解下如何使用
首先我们需要在我们的Dart代码中定义我们的想要调用的通道
当然这个频道的名字是可以自己定义的的,但是必须要要和一会在Android MainActivity中使用的一致。
然后,我们同个通道来调用在Android平台定义的方法
使用platform.invokeMethod(“showToast”,{“msg”:msg})来调用我们在Android平台定义的“showToast”方法
接下来,我们来看下我们在Android Activity做了哪些事情
首先我们也定义了一个跟dart文件中一样的”com.flyou.test/android”
然后我们创建了一个MethodChannel对象并对回调多了处理
当回调中参数的method方法和我们在dart中定义的一样时,我们就调用Android平台的Toast方法弹出吐司,如果msg为空则弹出toast text must not null的吐司。
当我们点击flutter程序中的按钮时,就会触发调用Android系统的Toast回调。
看下效果:
和上面的类似,我们可以调用系统的方法,我们同样刻印调用我们自己写的方法并且返回调用方法的值,那么我们还是举个例子看下吧。
我们通过flutter调用Android平台的方法获取当前格式化好的时间。
同样的我们还是用用和刚才一样的通道,只不过这一次我们需要更改我们调用的方法即可。
我们使用一个泛型为String的Future对象来接收Androd平台传来的字符串信息。然后调用then来显示字符串。
在MainActivity中我们定义一个getCurrentTime的方法,当触发方法名为getAndroidTime时调用改方法并返回给Flutter调用处。
下面就是效果了:
在前面的Flutter与平台的交互图上我们可以看到,使用MethodChannel可以调用原生平台的方法,在上面的例子中我们呢也给大家演示了如何使用,但是我们如何获取原生平台的监听与回调呢?类似于Android中的广播我们如何在Flutter接收到呢?
下面我们就需要来看下EventChannel了,借助于EventChannel(事件通道)我们可以很轻易的接收平台事件监听的回调。
那么我们还是举个例子,以Android平台网络变化为例,每当网络变化时就会触发Android本地的广播,然后通过EventChannel通知给Flutter组件中,这时候只要我们在Flutter注册相应的EventChannel就可以实现对网络变化事件的监听。
下面我们首先看下ManActivity方法中是怎么做的
在MainActivity中我们做了三件事件:
第一件事,跟上面的一样,让用户可以通过自己去触发操作判断当前网络是否可用,当然还是通过MethodChannel来实现的,然后把网络连接的状态通过我们刚才实现的Toast来弹出来。
当然这件事我们可以不做,只做监听也是可以的
第二件事,我们构造了一个动态广播接受者,来处理网络变化的广播事件,当接收到广播时判断网络状态并返回给Flutter中
第三件事,我们新建了EventChannel对象来对广播进行注册于解注册操作,负责广播的管理,并且声明注册广播的过滤器ConnectivityManager.CONNECTIVITY_ACTION,意思就是只接受网络状态变化的广播。
同样的我们定义了一个NET_CHANGE_CHANNEL通道。
在Flutter中我们需要注册对广播事件的监听并处理传来的事件即可。
在Flutter中我们使用了StatefulWidget在构建组件,使得获取到系统网络变化时可以及时更新界面UI状态。
具体的流程如下:
首先我们声明了跟MainActivity中一样的方法通道和事件通道来调用系统的方法接收系统的广播回调。
其次,我们完成对方法的注册于事件广播的注册
可以看到 eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError) 回调事件我们单独写成方法来处理。
最后,当系统广播触发时,我们通过事件通过或者方法通道来将事件并更新界面上按钮的状态。
我们还是来看下效果:
点击左下角阅读原文,体验更佳阅读效果
我怀疑这个是个坏掉的二维码,分享到朋友圈试试?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有