Flutter通过MethodChannel调用安卓Kotlin方法报MissingPluginException问题
问题根因&修复方案
- 确认两端通道名称完全一致,注意大小写、特殊字符完全匹配,你当前提供的代码中两端名称一致,若实际代码有拼写错误也会触发该异常
- 未初始化
lateinit修饰的flutterEngine就直接访问
你在Kotlin类中用lateinit var flutterEngine : FlutterEngine声明了引擎变量,但直接在类成员属性初始化阶段就调用flutterEngine.dartExecutor.binaryMessenger创建MethodChannel,此时flutterEngine还没有被赋值,初始化直接失败,通道没有成功注册到Flutter引擎,自然Dart端调用找不到对应实现。
修复建议:将MethodChannel的初始化逻辑放到单独的初始化方法中,等外部把FlutterEngine实例传入赋值后再调用。 - 方法名判断逻辑错误
你当前的判断条件call.equals("customizar")是错误的,call是MethodCall类型的对象,不是方法名字符串,需要取call.method属性和方法名做对比,否则判断永远不成立,就算通道注册成功也无法匹配到对应方法。 - 缺少MethodChannel返回结果回调
调用完原生逻辑后没有调用result.success()/result.error()返回结果给Dart端,虽然不会直接触发当前的MissingPluginException,但会导致Dart端调用长期挂起直到超时抛出异常。 - 自定义Kotlin类未正确实例化绑定
需要确认你在安卓入口的MainActivity中正确实例化了这个Kotlin类,并且将当前Activity绑定的FlutterEngine实例传入该类,完成通道注册,否则你的通道注册代码根本不会执行。
修复后Kotlin代码参考
class Custom3dsHandler(var activity: Activity, val environment: Environment) { lateinit var flutterEngine : FlutterEngine val CHANNEL = "android3ds/channel" private var methodChannel: MethodChannel? = null // 外部传入FlutterEngine后调用该方法完成通道注册 fun initChannel() { methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL) methodChannel?.setMethodCallHandler { call, result -> if (call.method == "customizar") { customizar() // 按需返回结果,没有返回值传null也可以 result.success(null) } else { // 没匹配到方法的时候要调用notImplemented result.notImplemented() } } } fun customizar() { // 你的业务逻辑 } }
MainActivity中绑定示例
class MainActivity : FlutterActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 实例化你的自定义类,传入FlutterEngine完成初始化 val handler = Custom3dsHandler(this, Environment.PROD) handler.flutterEngine = flutterEngine handler.initChannel() } }
内容的提问来源于stack exchange,提问作者Fabrício Gerhardt Jr
相关产品推荐
相关产品推荐

