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
相关产品推荐
相关产品推荐

