文章目录
- 知识回顾
- 示例代码
- 经验总结
我们在上一章回中介绍了通道相关的内容,本章回中将介绍其中的一种通道:MethodChannnel.闲话休提,让我们一起Talk Flutter吧。
知识回顾
我们在上一章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通道:MethodChannel.该通道主要通过方法实现通信功能,我们可以通
过方法的参数在通道上传递数据,该通道支持双向通信,就是说Flutte既可以使用通道给原生平台发送数据,也可以使用通道接收原生平台发来的数据。
示例代码
通道的使用方法在前面章节已经介绍过,不过比较抽象,我们在这里通过具体的示例代码来演示:
- 在Flutter中创建通道,使用构造方法就可以创建通道,方法的参数最好使用域名/功能名这样的形式,因为在原生代码中会通过该名称获取该通道;
flutterMethodChannel = MethodChannel("www.acf.com/battery");
- 监听通道中的方法或者事件.这里使用通道的invokeMethod()方法监听通道中名叫getBattery的方法,它可以获取到方法的的返回值。此外,我们还通过方法的
参数给原生平台发送数据,名叫data的参数表示具体的数据。
result = await flutterMethodChannel.invokeMethod("getBattery",data);
- 在原生平台的代码中获取通道;这里继承了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()
}
}
}
}
- 给通道设置监听器,在监听器中实现原生平台上特有的功能;设置监听器通过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"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!