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

Flutter:如何从Firebase通知Payload获取JSON数据并弹出自定义弹窗

解决Firebase推送Payload数据获取问题

看了你的代码和控制台输出的Payload,问题出在你对Payload结构的判断上——你的推送数据里既没有data子字段,也没有notification子字段,所以之前的取值方式自然拿不到数据。

先拆解下你当前的Payload结构:

notification message {gcm.message_id: 1578573493122232, id: 30, google.c.a.e: 1, type: test, aps: {alert: {title: notication title, body: Message of Push notification}, sound: 1}}

这里的自定义业务数据(id、type)是直接放在顶层Map里的,而iOS的通知展示内容(标题、正文)则嵌套在aps.alert下面。

给你修正后的处理函数,直接就能拿到需要的数据,还加了空安全处理避免崩溃:

Future<void> _handleNotification(Map<dynamic, dynamic> message, bool dialog) async {
  // 获取自定义业务数据:id和type
  final String? itemId = message['id']?.toString();
  final String? notificationType = message['type'];
  
  // 获取通知的标题和正文(适配iOS的aps结构)
  final Map<dynamic, dynamic>? apsInfo = message['aps'];
  final String? notifyTitle = apsInfo?['alert']?['title'];
  final String? notifyBody = apsInfo?['alert']?['body'];

  // 打印验证数据
  debugPrint("业务ID: $itemId");
  debugPrint("通知类型: $notificationType");
  debugPrint("通知标题: $notifyTitle");
  debugPrint("通知正文: $notifyBody");
  
  // 这里添加你要显示的自定义对话框逻辑
  if (dialog && context != null) {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text(notifyTitle ?? '新通知'),
        content: Text(notifyBody ?? '您收到一条推送消息'),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(context),
            child: const Text('关闭'),
          ),
        ],
      ),
    );
  }
}

另外补充个小细节:如果你的推送需要同时兼容Android,Android的Payload结构通常会把通知内容放在notification字段里,自定义数据放在data字段。你可以加个兼容判断,比如:

// 兼容Android和iOS的通知正文获取方法
String? getNotifyBody(Map<dynamic, dynamic> message) {
  // Android的正文路径
  final String? androidBody = message['notification']?['body'];
  // iOS的正文路径
  final String? iosBody = message['aps']?['alert']?['body'];
  return androidBody ?? iosBody;
}

这样不管是iOS还是Android的推送,都能正确拿到通知正文了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:39:10