一:简介
Flutter 中调用这些能力就必须和原生平台进行通信。目前Flutter 已经支持 iOS、Android、Web、macOS、Windows、Linux等众多平台,要调用特定平台 API 就需要写插件。插件是一种特殊的包,和纯 dart 包主要区别是插件中除了dart代码,还包括特定平台的代码,比如 image_picker 插件可以在 iOS 和 Android 设备上访问相册和摄像头。
Flutter 中我们想根据宿主平台添加一些差异化的功能,因此 Flutter 中提供了一个全局变量 defaultTargetPlatform
来获取当前应用的平台信息,defaultTargetPlatform
定义在"platform.dart"中,它的类型是TargetPlatform
,这是一个枚举类
enum TargetPlatform {
android,
fuchsia,
iOS,
...
}
二: 具体实现:
Flutter端实现
1).Flutter 需要创建 MethodChannel
2).调用方法。
创建通道, flutter/test 通道名称,各端需要一直。
MethodChannel _methodChannel = MethodChannel("flutter/test");
// 方法调用,(方法名称,传递参数)
String versionName = _methodChannel.invokeMethod<bool>("getVersionName", "获取版本");
Native 端实现,已android 为例
1):android 端创建通道。
2):实现方法,数据返回。
var mMethodChannel: MethodChannel? = null
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.plugins.add(FlutterUmengPlugin()) // 添加插件
mMethodChannel = MethodChannel(messenger, "flutter/test")
mMethodChannel?.setMethodCallHandler { call, result ->
Log.d("tag", "mMethodChannel.call.method" + call.method)
when (call.method) {
"getVersionName" -> {
result.success(gePlatform())
}
else -> {
result.error("UNAVAILABLE", "not find", null)
}
}
}
}
private fun gePlatform(): String {
return "1.1";
}
三:插件实现
优点:功能隔离,便于维护。
Flutter 端实现
class FlutterPlugin {
static const MethodChannel _channel = MethodChannel('flutter/flutter_plugin');
static Future<String> testText({required String testString}) async {
Map<String, dynamic> testMap = {
"test": shareString,
};
final String result = await _channel.invokeMethod('testText', shareMap);
Print.print("testText result--> " + result);
return result;
}
Native 端实现 android 为例
public class FlutterPlugin implements MethodCallHandler, EventChannel.StreamHandler, FlutterPlugin {
private Context applicationContext;
private MethodChannel methodChannel;
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
if (call.method.equals("test")) {
String test = call.argument("test");
Log.d(TAG, "test value " + test);
result.success("share success");
} else {
result.notImplemented();
}
}
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
Log.d(TAG, "onAttachedToEngine");
onAttachedToEngine(binding.getApplicationContext(), binding.getBinaryMessenger());
}
private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger) {
this.applicationContext = applicationContext;
methodChannel = new MethodChannel(messenger, "flutter/flutter_plugin");
methodChannel.setMethodCallHandler(this);
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
applicationContext = null;
methodChannel.setMethodCallHandler(null);
methodChannel = null;
}
// FlutterTestActivity
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.plugins.add(FlutterUmengPlugin()) // 添加插件
}