前言
相信大家对于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是不错的选择,不过个人觉得,如果使用这些框架还是自己学一点原生技术会比较好。