有关flutter调用Adnroid sdk

这是本人的一些真实经历,为了调用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: ");
        }

    }

}
接下来我们在看MainActivity中的操作,在Activity中会有一个方法叫 configureFlutterEngine(),我们在这个方法里面进行注册
  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);
    //这里我们传入一个上下文,方便调用.
    flutterEngine.getPlugins().add(new FlutterPlugin(MainActivity.this));

  }
这就是一个整体的流程了,好了,不多说了,敲代码去了!

你可能感兴趣的:(有关flutter调用Adnroid sdk)