第二百六十回

发布时间:2024年01月11日


我们在上一章回中介绍了通道相关的内容,本章回中将介绍其中的一种通道:MethodChannnel.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

知识回顾

我们在上一章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通道:MethodChannel.该通道主要通过方法实现通信功能,我们可以通
过方法的参数在通道上传递数据,该通道支持双向通信,就是说Flutte既可以使用通道给原生平台发送数据,也可以使用通道接收原生平台发来的数据。

示例代码

通道的使用方法在前面章节已经介绍过,不过比较抽象,我们在这里通过具体的示例代码来演示:

  1. 在Flutter中创建通道,使用构造方法就可以创建通道,方法的参数最好使用域名/功能名这样的形式,因为在原生代码中会通过该名称获取该通道;
  flutterMethodChannel = MethodChannel("www.acf.com/battery");
  1. 监听通道中的方法或者事件.这里使用通道的invokeMethod()方法监听通道中名叫getBattery的方法,它可以获取到方法的的返回值。此外,我们还通过方法的
    参数给原生平台发送数据,名叫data的参数表示具体的数据。
    result = await flutterMethodChannel.invokeMethod("getBattery",data);
  1. 在原生平台的代码中获取通道;这里继承了FlutterActivity类并且重写类中的configureFlutterEngine()方法,在该方法中获取通道;
class MainActivity: FlutterActivity() {
    private val channel = "www.acf.com/battery"
    //重写方法来设置chanel监听器,用来监听channel中的方法
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,channel)

        // 设置监听器用来监听channel中的方法,就是flutter代码中的invokeMethod()方法调用的方法
        methodChannel.setMethodCallHandler { call, result ->
            //判断是否是获取电量的方法,不是则返回错误,返回内容通过监听器中的result参数返回
            if(call.method == "getBattery") {
                //从arguments参数中获取数据
                var data = call.arguments
                Log.d(TAG, "configureFlutterEngine: arguments: "+data.toString())

                val battery = getBattery()
                if(battery == -1) {
                    result.error("300","unKnowError",null)
                }else {
                    result.success(battery)
                }
            }else {
                result.notImplemented()
            }
        }
    }
}
  1. 给通道设置监听器,在监听器中实现原生平台上特有的功能;设置监听器通过setMethodCallHandler()方法实现,详细可以参考上面的代码片段。该方法包含的参
    数call可以识别通道名称,以及从中获取通道中发送来的数据。result参数主要用来给channel回复数据以及错误信息。电量信息是原生平台提供的功能,下面是它的
    示例代码。我们将其封装成了独立的方法,把该方法的返回值添加到通道中可以给Flutter平台回复电量信息数据。
    private fun getBattery(): Int {
        var res = 0
        if(Build.VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
            val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
            res = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        }else {
            val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(
                Intent.ACTION_BATTERY_CHANGED))
        }
        return res;
    }

我们在这里使用的示例代码主要参考了官方文档中给的示例,同时结合了自己的分析。上面步骤中的3和4是在Andoird平台上编写的,位于MainActivity.kt文件中。
我们还需要在IOS平台上实现类似的代码,我在这里就不演示了,因为它们的思路相同。

经验总结

本章回中介绍的MethodChannel通道类似方法,Flutter通过方法的参数给原生平台发送数据。原生平台通过方法的返回值给Flutter发送数据。这样便实现了双向通
信功能。我在这里就不演示程序的运行结果了,建议大家自己动手去实现。不过我分享一些编译时的经验。

  • 编写channel中的代码时需要使用xCode打开flutter的项目;
  • 编写channel中的代码时最后使用androidStudio重新打开andorid项目,这样会自动生成android项目文件,而不要在原来的flutter项目中编辑android代码。
  • 运行时IOS原生代码需要使用xCode编译运行,Android原生代码需要在flutter项目中编译运行才有效果。
    看官们,与"如何使用MethodChannel"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!
文章来源:https://blog.csdn.net/talk_8/article/details/135540825
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。