这是本人的一些真实经历,为了调用Android界面UI的sdk,耗费将近三天时间,再终于把这个Flutter与Android传值弄明白,网上资料也不全,还需要自己摸索
首先你需要创建一个flutter_plugin项目,让后创建完之后,回在lib目录下生产一个pulgin.dart文件,然后还有一个.Android目录和一个example测试目录
然后在我们生成的目录下定义一个管道,MethodChannel,用来通信的.下面贴上我的代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class KycFlutterPlugin {
static KycFlutterPlugin kycFlutterPlugin = new KycFlutterPlugin();
//获取当前类的实例
KycFlutterPlugin getInstaner(){
return kycFlutterPlugin;
}
//这里初始化通道,里面存放一个name,用来和Android进行交互
static const channel = MethodChannel('kyc_flutter_plugin');
//这是我自定义的方法,想要让flutter传递一个map类型的数据
Future setUesr(String name,String id){
return channel.invokeMethod('faceVerifyResult',{"name":name,'cardId':id});
}
}
然后在我们的测试目录下,也就是.example下的lib文件里面,设置一个按钮,按钮点击之后调用我们刚在在这个plugin定义的方法,比如说:
IconButton(
icon: Icon(Icons.tag_faces),
onPressed: () {
//在这里面判断机型是Android 还是ios,
//我们用的Android,所以走Android这个方法
if(Platform.isAndroid){
print("----调用AndroidSdk");
onPlatformViewCreatedAndroid();
}else if(Platform.isIOS){
}
})
这里写我们一开始在plugin文件里面定义的方法我们直接调用我们定义的方法向Android传输数据
onPlatformViewCreatedAndroid() {
var mm = KycFlutterASPlugin().getInstaner().setUser(controller1.text,controller2.text);
mm.then((res){
//Android返回的结果
});
}
**然后在打开.Android目录,自己写一个Plugin类,实现两个方法
FlutterPlugin,MethodChannel.MethodCallHandler**
public class FlutterPlugin implements io.flutter.embedding.engine.plugins.FlutterPlugin, MethodChannel.MethodCallHandler {
private static final String TAG = "FlutterPlugin";
//这里是和我们flutter中的名字一样
private static final String methodChannelName = "kyc_flutter_plugin";
private MethodChannel methodChannel;
private static Context context;
public FlutterPlugin(Context context) {
this.context=context;
}
@Override
public void onAttachedToEngine(FlutterPluginBinding binding) {
methodChannel = new MethodChannel(binding.getBinaryMessenger(),methodChannelName);
methodChannel.setMethodCallHandler(this);
}
@Override
public void onDetachedFromEngine(FlutterPluginBinding binding) {
methodChannel.setMethodCallHandler(null);
}
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
if(call.method.equals("faceVerifyResult")){
//这里就是flutter传送过来的数据,比如我是flutter传过来一个Hashmap类型的值
HashMap map =call.arguments();
String name = (String) map.get("name");
String id = (String) map.get("cardId");
//我们现在已经获取到我们想要flutter的值,就可以在这里进行调用Android原生sdk的操作,如果说需要权限申请还是在我们的MainActivity中进行申请
.....
}else if(call.method.equals("setfaceVerifyResult")){
result.success("Android发送的数据");
Log.d(TAG, "onMethodCallElse: "+"Android");
}else{
result.error("-1","shibi",null);
Log.d(TAG, "onMethodCallErro: ");
}
}
}
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
//这里我们传入一个上下文,方便调用.
flutterEngine.getPlugins().add(new FlutterPlugin(MainActivity.this));
}