官方教程 : 撰写双端平台代码 [flutter plugin
]https://flutter.cn/docs/development/packages-and-plugins/developing-packages
本来想按照教程按部就班的写的时候发现都堆在了MainActivity里不是很美观,偶然看到发布flutter plugin插件实现的功能好像是一样的 就试了一下
1. 打开androidStudio 创建一个新的FlutterPlugin (我更习惯写java 这里可以随便选 看你项目是用什么语言的)
2. 取出它的Dart放到你的dart文件夹中去
import 'dart:async';
import 'package:flutter/services.dart';
class Untitled {
///这里你起一个美丽的名字 越独一无二越好 但是这个名字要和你的原生端保持一致
static const MethodChannel _channel = MethodChannel('com.xxx.xxx/untitled');
static Future<String?> get platformVersion async {
final String? version = await _channel.invokeMethod('getPlatformVersion');
return version;
}
}
3. 取出他的java 文件放在Android端下面
public class UntitledPlugin implements FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private MethodChannel channel;
private FlutterActivity activity;
///构造函数 有些时候调用原生方法可能需要activity 就传进来了
UntitledPlugin(FlutterActivity activity) {
this.activity = activity;
}
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
///这个地方就是换你独一无二的名字的地方
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "com.xxx.xxx/untitled");
channel.setMethodCallHandler(this);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
//这里是你要实现的方法
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
}
4. 引用插件 官方是说在 文件中引用 我直接在MainActivity中注册了
///仿照GeneratedPluginRegistrant 中的Plugin注册方式
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
// 引入你写的插件
try {
flutterEngine.getPlugins().add(new UntitledPlugin(this));
} catch (Exception e) {
Log.e(getLocalClassName(), "Error registering pluginCustomChannelPlugin,", e);
}
}