Flutter集成Firebase Messaging报类无默认构造函数的问题
问题产生原因
该报错由代码与firebase_messaging插件版本API不匹配直接导致:
- v7及更早的
firebase_messaging插件版本中,FirebaseMessaging类提供公开无参默认构造函数,支持通过FirebaseMessaging()语法直接实例化 - v8及以上版本的插件重构了整体API架构,官方移除了公开无参构造器,改为通过单例模式管理全局FCM实例,同时完全下线了旧版的
configure()初始化方法,原有旧版写法在新版本中无法正常运行,因此触发“类不存在默认构造函数”的编译报错。
适配新版插件的实现方案
- 替换实例化逻辑
移除手动调用构造器的代码,通过插件提供的单例入口获取全局唯一的FCM实例,不需要手动触发对象构造。 - 迁移原有三类通知回调逻辑
旧版configure()方法绑定的三类消息场景,在新API中被拆分为独立的监听接口,需要逐一适配,不能再调用已被移除的configure()方法: - 应用处于前台时收到推送的场景,对应
FirebaseMessaging.onMessage监听 - 应用处于后台时用户点击通知打开应用的场景,对应
FirebaseMessaging.onMessageOpenedApp监听 - 应用被完全杀死(冷启动)状态下用户点击通知拉起应用的场景,通过
getInitialMessage()方法获取启动时携带的通知数据 - 保留原有业务逻辑
原有“解析通知内的骑乘请求ID、拉取对应请求信息”的业务逻辑可以直接迁移到新的监听回调中,不需要修改核心业务流程。 - 原有AndroidManifest.xml中配置的
FLUTTER_NOTIFICATION_CLICKintent-filter规则完全兼容新版插件,不需要额外修改。
适配后的完整代码参考
import 'package:flutter/material.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; class PushNotificationService { // 通过单例获取FCM实例,无需手动调用构造器 final FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance; Future initialize(context) async { // 前台收到推送的回调逻辑 FirebaseMessaging.onMessage.listen((RemoteMessage message) { retrieveRideRequestInfo(getRideRequestId(message), context); }); // 后台状态下点击通知打开应用的回调逻辑 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { retrieveRideRequestInfo(getRideRequestId(message), context); }); // 冷启动状态下点击通知拉起应用的逻辑 final initialMessage = await firebaseMessaging.getInitialMessage(); if (initialMessage != null) { retrieveRideRequestInfo(getRideRequestId(initialMessage), context); } } // 原有自定义工具方法适配新的RemoteMessage参数 String getRideRequestId(RemoteMessage message) { return message.data['ride_request_id'] ?? ''; } Future<void> retrieveRideRequestInfo(String rideRequestId, BuildContext context) async { // 原有业务逻辑保持不变 } }
内容的提问来源于stack exchange,提问作者Franklin Premkumar
相关产品推荐
相关产品推荐

