You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 验证回调与渠道配置

  1. 在FirebaseMessaging.onMessage.listen回调中添加打印日志,确认前台收到消息时回调正常触发:
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  print("前台收到消息:${message.data}");
  NotificationService.showNotification(message);
});
  1. 检查res/values/strings.xml中的default_notification_channel_id取值,和代码中AndroidNotificationDetails的第一个参数完全一致,避免渠道不匹配导致通知无法弹出。

内容的提问来源于stack exchange,提问作者user17091737

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:15:09