正文
MethodChannel可以实现Flutter调用Android,也可以实现Android调用Flutter,这里分别来进行举例。
2.Flutter调用Android
这里实现一个Android的简单的功能:弹出一个AlertDialog,然后在Flutter中调用这一功能。
Android端实现
先在MainActivity中实现功能,如下所示。
package com.example.platform_channel;
import android.app.AlertDialog;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
MethodChannel methodChannel = new MethodChannel(getFlutterView(), "com.example.platform_channel/dialog");
methodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
if ("dialog".equals(methodCall.method)) {
if (methodCall.hasArgument("content")) {
showAlertDialog();
result.success("弹出成功");
} else {
result.error("error", "弹出失败", "content is null");
}
} else {
result.notImplemented();
}
}
private void showAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("确定", null);
builder.setTitle("Flutter调用Android");
builder.show();
}
});
}
}
复制代码
注释1处用于注册插件,这个是创建Flutter工程时MainActivity自带的。
注释2处创建一个MethodChannel,它有两个参数,一个是getFlutterView方法,用于获取FlutterView,FlutterView实现了BinaryMessenger接口。一个是MethodChannel的Name,这个Name要保证是唯一的,后面Flutter端实现中会用到这个Name。
注释3处为methodChannel注册一个MethodCallHandler,用于监听回调的数据。
onMethodCall方法中的result是Flutter端传来的数据,我们需要对数据进行判断,然后向Flutter端发送数据。
向Flutter端发送数据有以下方法:
result.success(Object result)
结果成功,将result返回给Flutter端。
result.error(String errorCode,String errorMsg,Object errorDetails)
结果失败,将errorCode、errorMsg、errorDetails返回给Flutter端。
result.notImplemented()
Android端没有实现Flutter端需要的方法,会将notImplemented返回给Flutter端。
Flutter端实现
在main.dart中加入如下代码。