Flutter接入Firebase动态链接后收FCM通知报PluginRegistrantCallback未设置崩溃
问题解决方案
该错误核心原因是7.x及更早版本的firebase_messaging插件在后台接收通知启动独立Isolate时,无法正确获取已注册的插件回调,接入firebase_dynamic_links后插件注册逻辑冲突触发了这个问题,按以下步骤修复:
1. 修复依赖版本冲突
你当前使用的firebase_messaging: ^7.0.0-dev.15属于不稳定的开发版,和firebase_dynamic_links: ^0.5.0+11存在已知的插件注册冲突,且pubspec.yaml中重复声明了firebase_core依赖,先做如下调整:
- 删除重复的
firebase_core: ^0.5.0声明 - 升级依赖到兼容的稳定版本组:
firebase_core: ^0.7.0 firebase_auth: ^0.20.1 firebase_messaging: ^8.0.0-dev.15 # 注:8.x版本的API有调整,需要同步修改Dart层的FCM调用代码 firebase_dynamic_links: ^0.6.2
调整后执行flutter clean,重新拉取依赖编译即可解决大部分同场景崩溃问题。
2. 手动注册PluginRegistrantCallback(兼容旧版本)
如果暂时不想升级大版本,即使使用Flutter Android Embedding V2,7.x及更早版本的firebase_messaging仍需要手动配置自定义Application类注册回调,操作如下:
- 在
android/app/src/main/kotlin/[你的应用包名路径]/下新建Application.kt文件,代码如下:
import io.flutter.app.FlutterApplication import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService class Application : FlutterApplication(), PluginRegistrantCallback { override fun onCreate() { super.onCreate() FlutterFirebaseMessagingService.setPluginRegistrant(this) } override fun registerWith(registry: PluginRegistry?) { io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")) io.flutter.plugins.firebasedynamiclinks.FirebaseDynamicLinksPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasedynamiclinks.FirebaseDynamicLinksPlugin")) // 如果你还用到其他需要原生交互的插件,也在这里补充注册逻辑 } }
- 打开
android/app/src/main/AndroidManifest.xml,找到<application>标签,添加android:name=".Application"属性:
<application android:name=".Application" android:label="你的应用名称" android:icon="@mipmap/ic_launcher"> <!-- 原有meta-data、intent-filter配置保持不变 --> </application>
3. 校验业务逻辑配置
- 确保你注册的
onBackgroundMessage回调是顶级静态函数,不能是类的实例方法 - 如果通知payload中携带动态链接,不要在原生层配置跳转逻辑,统一在Dart层的
onLaunch/onResume/onMessage回调中处理动态链接的解析和跳转,避免原生Intent抢占触发异常
内容的提问来源于stack exchange,提问作者Prajeet Mehra
相关产品推荐
相关产品推荐

