Flutter插件开发(二):MethodChannel
Flutter与Native的通信,有3个不同类型的Channel,它们分别是:
1.MethodChannel
通常用于调用Native中的某个方法;
2.EventChannel
用于数据流(event streams)的通信。有监听功能,比较经典的例子,如电量变化之后直接推送数据给flutter端;
3.BasicMessageChannel
用于传递字符串和半结构化的信息,这个用的比较少.
本章节主要介绍MethodChannel的使用.
系统创建的Flutter Plugin项目,其实系统已经默认创建了MethodChannel通信.我们可以直接在此基础上进行构建.但是这里为了表述更加清楚,我把相关代码都清除了,然后重头一步一步的讲解MethodChannel的通信构建.
一.Flutter端
在lib目录下,新建method_channel_dev.dart文件,
class MethodChannelDev {
//定义一个MethodChannel通道,同时约定通道名称method_channel.
static const MethodChannel _channel = MethodChannel('method_channel');
static Future<String?> getText()async{
//通过方法invokeMethod,同时约定方法名method_channel_test,获取从原生端返回的字符串.
return await _channel.invokeMethod('method_channel_test');
}
}
二.Android端
在Android端目录下新增PluginDevPlugin文件:
public class PluginDevPlugin implements FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAware {
private MethodChannel channel;
private Activity mActivity;
@Override
public void onAttachedToEngine(@NonNull FlutterPlugin.FlutterPluginBinding binding) {
channel = new MethodChannel(binding.getBinaryMessenger(), "method_channel"); //必须与flutter端的通道名一致
channel.setMethodCallHandler(this); //与MethodCallHandler绑定
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPlugin.FlutterPluginBinding binding) {
channel.setMethodCallHandler(null); //与MethodCallHandler解绑
}
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
mActivity = binding.getActivity(); //在这里获得activity
}
@Override
public void onDetachedFromActivityForConfigChanges() {
}
@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
}
@Override
public void onDetachedFromActivity() {
mActivity = null;
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
//在这里获取从flutter端传过来的参数,并把android端的结果返回给flutter
if (call.method.equals("method_channel_test")) { //与flutter端定义的方法名必须一致
result.success("我是从原生平台返回的数据");
} else {
result.notImplemented();
}
}
}
要点讲解:
可以看到这里实现了3个接口,分别是:FlutterPlugin,MethodCallHandler和ActivityAware.在MethodChannel通信中,这3个方法是最重要的,它们分别的作用是:
1.FlutterPlugin
实现该接口时,需要重写2个方法: onAttachedToEngine和onDetachedFromEngine.前者实例化了MethodChannel通道,同时和MethodCallHandler进行绑定.后者和MethodCallHandler进行解绑.
2.MethodCallHandler
实现该接口需要重写1个方法:onMethodCall.该方法的作用是接收从Flutter端传过来的参数,并把android端的结果返回给Flutter.具体的使用方法,可以参考代码中的示例.
3.ActivityAware
实现该接口需要重写的方法比较多(4个),但是一般只会用到2个方法: onAttachedToActivity和onDetachedFromActivity.从代码中可以看出,它们的作用也很明显.前者用于获取Activity实例.后者是销毁实例.
完整demo地址:https://github.com/shijia2118/flutter_platform_channel