flutter 插件
一:简介
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;
-
-
-
public void onMethodCall( MethodCall call, 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();
-
}
-
}
-
-
-
public void onAttachedToEngine( 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);
-
}
-
-
-
public void onDetachedFromEngine( FlutterPluginBinding binding) {
-
applicationContext = null;
-
methodChannel.setMethodCallHandler(null);
-
methodChannel = null;
-
}
-
-
// FlutterTestActivity
-
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
-
super.configureFlutterEngine(flutterEngine)
-
flutterEngine.plugins.add(FlutterUmengPlugin()) // 添加插件
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcakec
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01