Flutter集成Firebase Messaging后前台推送通知不显示后台正常如何解决
问题根因
NotificationService类的初始化逻辑存在实例冲突问题:initialize方法内重新定义了一个局部的FlutterLocalNotificationsPlugin实例做初始化,而前台调用showNotification方法时使用的是类静态的未初始化的_flutterLocalNotificationsPlugin实例,导致通知无法弹出。
修复方案
1. 修正NotificationService初始化逻辑
修改NotificationService.dart代码,删除局部重复实例定义,直接使用类静态实例完成初始化:
class NotificationService { static final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); static Future initialize() async { AndroidInitializationSettings androidInitializationSettings = AndroidInitializationSettings('@mipmap/ic_launcher'); InitializationSettings initializationSettings = InitializationSettings(android: androidInitializationSettings); await _flutterLocalNotificationsPlugin.initialize( initializationSettings, // onSelectNotification: doSomething(), ); } static Future showNotification(RemoteMessage message) async { AndroidNotificationDetails androidDetails = AndroidNotificationDetails( "default_notification_channel_id", "channel", enableLights: true, enableVibration: true, priority: Priority.high, importance: Importance.max, largeIcon: DrawableResourceAndroidBitmap("ic_launcher"), styleInformation: MediaStyleInformation( htmlFormatContent: true, htmlFormatTitle: true, ), playSound: true, ); await _flutterLocalNotificationsPlugin.show( message.data.hashCode, message.data['title'], message.data['body'], NotificationDetails( android: androidDetails, )); } }
2. 适配Android 13+通知权限
Android 13及以上系统需要主动申请通知权限才能弹出本地通知:
- 在
AndroidManifest.xml中新增权限声明:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
- 应用启动时主动申请权限,可通过permission_handler插件实现:
// 放在initState中初始化通知服务之前执行 if (Platform.isAndroid) { final status = await Permission.notification.request(); if (status.isDenied) { // 可自行添加权限被拒的提示逻辑 } }
3. 验证回调与渠道配置
- 在
FirebaseMessaging.onMessage.listen回调中添加打印日志,确认前台收到消息时回调正常触发:
FirebaseMessaging.onMessage.listen((RemoteMessage message) { print("前台收到消息:${message.data}"); NotificationService.showNotification(message); });
- 检查
res/values/strings.xml中的default_notification_channel_id取值,和代码中AndroidNotificationDetails的第一个参数完全一致,避免渠道不匹配导致通知无法弹出。
内容的提问来源于stack exchange,提问作者user17091737
相关产品推荐
相关产品推荐

