无需配置pubspec.yaml或独立包,在Flutter项目中直接使用自定义插件
在Flutter项目中本地集成自定义插件(无需pubspec.yaml或独立包)
一、放置插件代码到Android模块
将你的DemoPlugin代码放到Flutter项目的Android模块对应目录下:
- 打开项目的
android/app/src/main/kotlin/[你的应用包名]/路径(比如com/example/yourapp/) - 创建
DemoPlugin.kt文件,粘贴修正后的插件代码(补充通道常量、修复语法错误):
class DemoPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private lateinit var channel: MethodChannel private lateinit var context: Context private lateinit var activity: Activity // 定义唯一通道名,避免和其他依赖插件冲突 private const val channelName = "com.yourpackage.demo_plugin" override fun onMethodCall(call: MethodCall, result: Result) { when (call.method) { "demo" -> { result.success("Demo") } else -> result.notImplemented() } } override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPluginBinding) { context = flutterPluginBinding.applicationContext channel = MethodChannel(flutterPluginBinding.binaryMessenger, channelName) channel.setMethodCallHandler(this) } override fun onDetachedFromEngine(binding: FlutterPluginBinding) { channel.setMethodCallHandler(null) } override fun onAttachedToActivity(binding: ActivityPluginBinding) { activity = binding.activity } override fun onDetachedFromActivityForConfigChanges() {} override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {} override fun onDetachedFromActivity() {} }
二、手动注册插件到FlutterEngine
因为未通过pubspec.yaml配置,需要在Android的MainActivity中手动注册插件:
打开android/app/src/main/kotlin/[你的应用包名]/MainActivity.kt,修改configureFlutterEngine方法:
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine class MainActivity : FlutterActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 手动注册DemoPlugin flutterEngine.plugins.add(DemoPlugin()) } }
三、Flutter端调用插件
在Flutter代码中,通过对应MethodChannel调用插件方法:
import 'package:flutter/services.dart'; // 和插件中定义的channelName保持一致 const MethodChannel _channel = MethodChannel('com.yourpackage.demo_plugin'); Future<String?> callDemoMethod() async { try { final String? result = await _channel.invokeMethod('demo'); return result; } on PlatformException catch (e) { print("调用失败: ${e.message}"); return null; } }
注意事项
- 通道名称唯一性:务必确保
channelName和其他依赖插件的通道名不重复,否则会导致方法调用冲突 - 生命周期兼容:插件实现了
ActivityAware,手动注册后可正常获取Activity实例,无需额外配置 - 代码维护:插件代码直接放在项目Android模块中,后续修改直接编辑该文件即可
内容的提问来源于stack exchange,提问作者TamTH-Dev
相关产品推荐
相关产品推荐

