flutter调用原生代码

2,187 阅读2分钟

前言

相信大家对于Flutter、ReactNative、uniapp等这些跨平台技术已经很熟悉,但是在开发过程中是否发现,很多需求我们需要花费大量的时间去找人家写好的插件,是不是遇到一个插件的Bug就只能卑微的去提isuse,那么这个问题就不能解决了吗?答案是否定的,今天我就以实际需求出发,给大家分享一下,如何在使用flutter开发app的过程中如何去调用原生代码.

目录

  • 一、基本流程
  • 二、flutter与android相互调用
  • 三、flutter与swift相互调用
  • 四、结语

一、基本流程

我们实现flutter调用android和swift的功能基于MethodChannel,无论怎么调用,我们都要遵循一个原则,那就是ChannelName必须固定,调用逻辑如下图

graph LR
android注册通信通道-->flutter触发-->android执行对应方法-->调用三方SDK
swift注册通信通道-->flutter触发-->swift执行对应方法-->调用三方SDK

二、flutter与android相互调用

1.我们忽略打开安卓工程环境搭建等环节首先我们需要在MainActivity中声明好ChannelName,例如

public class MainActivity extends FlutterActivity {
    //通道名称
    private static final String wyMethodChannelName = "samples.flutter.io/wy";
}

2.声明好通道名称以后,我们需要创建通道监听,当flutter调用通道的时候,我们才能根据参数来判断出我们需要执行的原生代码,例如

public class MainActivity extends FlutterActivity {
    
    //通道名称
    private static final String wyMethodChannelName = "samples.flutter.io/wy";
    
    //初始化通信通道
    public void initMethodChannel(){
        new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), wyMethodChannelName).setMethodCallHandler(
            new MethodChannel.MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall call, MethodChannel.Result result){
                    
                    //你的业务代码
                    if(call.method.equals("test")){
                        //可以通过result返回Future
                    }else{
                    
                    }
                    
                }
            }
        );
    }
}

3.flutter端调用,那么到这就是flutter调用android的基本用法,android调用flutter原理无非就是反过来,看官继续往下看

await platform.invokeMethod('test','这里可以传递参数');

4.android调用flutter

// android代码
new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), wyMethodChannelName).invokeMethod("getContent", messageItem);
//flutter代码
Future<dynamic> platformCallHandler(MethodCall call) async {
  //名称和参数
  print('${call.method}-call.arguments');
}

三、flutter与swift相互调用

flutter与swift相互调用远离和android类似,故不作赘述,直接上代码,swift声明通道

func initMethodChannel(){

        self.wyChannel = FlutterMethodChannel.init(name: "samples.flutter.io/wy",
                                                   binaryMessenger: self.controller as! FlutterBinaryMessenger);
    
        self.wyChannel?.setMethodCallHandler({
            (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
            //你的业务代码
            if(call.method=="loginWy"){
                //可以通过result返回Future
            }
       });
    }

四、结语

在app的开发过程中,我尝试过各种方式,有用过原生开发、用过uniapp(包括原来所谓的MUI)、用过reactNative、甚至使用vue+crosswalk的方式,其次就是flutter,感觉下来,没有哪个技术高技术低的说法,看我们的使用场景,如果我们需要兼容多端,比如同时需要有小程序、web、app上线,那么uniapp是不错的选择,如果公司暂时没有原生人员,那么reactNative和flutter是不错的选择,不过个人觉得,如果使用这些框架还是自己学一点原生技术会比较好。