Flutter_local_notifications notificationResponse.payload 始终为空字符串,

mik*_*ssy 11 flutter firebase-cloud-messaging flutter-local-notification

我正在尝试设置我的移动应用程序,以便当用户收到 FCM 消息时,当他们单击该消息时,我可以使用消息中的数据将其路由到适当的屏幕。

我的 FCM 消息如下所示:

const fcmMessage = {
                notification: {
                    title: title,
                    body: message
                },
                data:{
                    type:'Chat',
                    Name: 'Mike',
                    body:'test'
                },
                android: {
                    notification: {
                        title:title,
                        body: message,
                        channel_id:'high_importance_channel'
                    }
                },
                token: msgToken,
            };
Run Code Online (Sandbox Code Playgroud)

然后在我的 main() 方法中,我按照下面的代码片段初始化 Flutter_Local_notifications。

问题是当我点击通知时,有效负载始终是空字符串?这些是执行此操作的代码行。为什么NotificationResponse.payload是空字符串?最终,我需要访问 FCM 消息中的“数据”对象。

void onDidReceiveNotificationResponse(NotificationResponse notificationResponse) async {
  print(notificationResponse.payload);
}
Run Code Online (Sandbox Code Playgroud)

这是完整的 main() 方法。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // Set the background messaging handler early on, as a named top-level function
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  if (!kIsWeb) {
    channel = const AndroidNotificationChannel(
      'high_importance_channel', // id
      'High Importance Notifications', // title/
      importance: Importance.high,
    );
  }


flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

var initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  var initializationSettingsIOs = DarwinInitializationSettings();
  var initSettings = InitializationSettings(
      android: initializationSettingsAndroid, iOS: initializationSettingsIOs);

  void onDidReceiveNotificationResponse(NotificationResponse notificationResponse) async {
    print(notificationResponse.payload);
}
   
  await flutterLocalNotificationsPlugin.initialize(initSettings,onDidReceiveNotificationResponse: onDidReceiveNotificationResponse,);
            
  /// Create an Android Notification Channel.
  /// We use this channel in the `AndroidManifest.xml` file to override the
  /// default FCM channel to enable heads up notifications.
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );


  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    print('Got a message whilst in the foreground!');
    print('Message data: ${message.data}');

    if (message.notification != null) {
      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;
      FlutterLocalNotificationsPlugin s = FlutterLocalNotificationsPlugin();
      s.show(
        notification.hashCode,
        notification?.title,
        notification?.body,
        NotificationDetails(
          android: AndroidNotificationDetails(channel.id, channel.name,
              icon: 'launch_background',
              channelDescription: channel.description,
              importance: Importance.max,
              priority: Priority.high,
              ongoing: true,
              styleInformation: BigTextStyleInformation('')),
        ),
      );
    }
  });


  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

更新,找到了我需要的东西。在 LocalNotification show 方法中,我们可以添加有效负载属性并将其设置为消息的任何部分。

对于我的用例,我对 message.data 进行编码,然后在 didReceive 方法中,我可以解码回 JSON 对象并根据需要使用。

 s.show(
        payload: jsonEncode(message.data),
        notification.hashCode,
        notification?.title,
        notification?.body,
        NotificationDetails(
          android: AndroidNotificationDetails(channel.id, channel.name,
              icon: 'launch_background',
              channelDescription: channel.description,
              importance: Importance.max,
              priority: Priority.high,
              ongoing: true,
              styleInformation: BigTextStyleInformation('')),
        ),
      );
Run Code Online (Sandbox Code Playgroud)

Eri*_*eni 6

您必须在 show 方法中提供有效负载属性:

import 'dart:convert';
// ...

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // Set the background messaging handler early on, as a named top-level function
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  if (!kIsWeb) {
    channel = const AndroidNotificationChannel(
      'high_importance_channel', // id
      'High Importance Notifications', // title/
      importance: Importance.high,
    );
  }


flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

var initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  var initializationSettingsIOs = DarwinInitializationSettings();
  var initSettings = InitializationSettings(
      android: initializationSettingsAndroid, iOS: initializationSettingsIOs);

  void onDidReceiveNotificationResponse(NotificationResponse notificationResponse) async {
// this should print now
    print(notificationResponse.payload);
// let's add some switch statements here
switch (notificationResponse.notificationResponseType) {
// triggers when the notification is tapped
        case NotificationResponseType.selectedNotification:
          if (notificationResponse.payload != null) {
            try {
              Map notificationPayload =
                  (jsonDecode(notificationResponse.payload!));
              print(notificationResponse.payload); // prints the decoded JSON
            } catch (error) {
              log('Notification payload error $error');
            }
          }
          break;
        default:
      }
}
   
  await flutterLocalNotificationsPlugin.initialize(initSettings,onDidReceiveNotificationResponse: onDidReceiveNotificationResponse,);
            
  /// Create an Android Notification Channel.
  /// We use this channel in the `AndroidManifest.xml` file to override the
  /// default FCM channel to enable heads up notifications.
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );


  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    print('Got a message whilst in the foreground!');
    print('Message data: ${message.data}');

    if (message.notification != null) {
      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;
      FlutterLocalNotificationsPlugin s = FlutterLocalNotificationsPlugin();
      s.show(
        notification.hashCode,
        notification?.title,
        notification?.body,
        NotificationDetails(
          android: AndroidNotificationDetails(channel.id, channel.name,
              icon: 'launch_background',
              channelDescription: channel.description,
              importance: Importance.max,
              priority: Priority.high,
              ongoing: true,
              styleInformation: BigTextStyleInformation('')),
        ),
        // provide payload here: message.data contains the payload
        // If your payload is in json, you might also want to encode it since flutter_local_notification accepts
        // strings
payload: jsonEncode(message.data),
      );
    }
  });


  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)