迁移适配v2 embedding时出现Unhandled Exception: MissingPluginException如何解决
异常产生原因
v2 embedding 重构了 Flutter 引擎和插件的注册逻辑,该异常通常由以下几类问题触发:
- 插件未完成v2 embedding适配:自定义插件没有实现
FlutterPlugin(Android)/FlutterPlugin(iOS)接口,未适配的旧版插件无法被v2引擎自动注册,导致方法通道找不到对应实现。 - 宿主注册逻辑遗漏:自定义
FlutterEngine初始化时未主动调用GeneratedPluginRegistrant完成全量注册插件,或者MainActivity/AppDelegate重写生命周期方法时,覆盖了默认的插件注册逻辑,导致插件未完成注册就被调用。 - 调用时机错误:在Flutter引擎初始化、插件注册完成前就调用原生方法,比如在
main函数runApp执行前触发方法调用会直接触发该异常。 - 打包配置问题:Android平台开启R8/ProGuard混淆时,插件注册类被混淆规则移除,运行时无法找到对应方法实现。
排查解决步骤
- 检查插件适配实现
自定义插件需完成v2适配:Android端插件主类实现FlutterPlugin接口,在onAttachedToEngine方法内完成方法通道初始化和注册,废弃旧版registerWith的手动注册逻辑;iOS端插件主类实现FlutterPlugin协议,注册逻辑放在registerWithRegistrar:方法内。 - 核对宿主端注册逻辑
Android端MainActivity继承FlutterActivity,自定义FlutterEngine初始化后必须调用GeneratedPluginRegistrant.registerWith(flutterEngine)完成插件注册;iOS端AppDelegate继承FlutterAppDelegate,不要手动修改默认的插件注册逻辑。 - 调整方法调用时机
所有原生方法调用逻辑需放在runApp执行完成之后,比如页面initState生命周期节点,确保调用时插件已完成注册。 - 排查混淆配置
Android端在proguard-rules.pro添加对应插件的防混淆规则,临时关闭混淆重新编译,验证是否是混淆导致的类被移除问题。 - 清理缓存重试
执行flutter clean清理项目缓存,再执行flutter pub get拉取依赖后重新编译,排除缓存导致的注册逻辑未更新问题。
内容的提问来源于stack exchange,提问作者Ilya Maximencko
相关产品推荐
相关产品推荐

