Flutter中如何将FCM通知的JSON数据添加到自定义内容列表
FCM自定义数据映射到FCMContent列表的可运行实现
先解决硬编码问题
你现在的代码有两个会直接影响运行的偏差:
- 目标列表
fcmcrafts是List<FCMContent>类型,之前往列表里插字符串通知标题的写法会直接报类型不匹配的编译错误,必须替换成插入符合泛型要求的FCMContent实例。 - 不要去
notification.notification对象里找你的业务字段:这个对象只存FCM规定的通知标准属性(标题、正文、图标等),你要的audioid、name这些自定义业务值,全部在RemoteMessage的data属性里——SDK收到消息时已经把这段内容解析成Map<String, String>结构,不需要额外手动JSON解码。
正式实现
你已经写好的FCMContent.fromJson序列化逻辑可以直接复用,和从PHP接口拉取的列表对象完全兼容,不需要改原有类的代码。改写onNotify回调如下:
@override void onNotify(RemoteMessage notification) { // 保留原有后台通知处理逻辑 _firebaseMessagingBackgroundHandler(notification); setState(() { _notification = notification; // 从FCM的data段提取字段,构建FCMContent实例 final fcmContent = FCMContent( audioid: notification.data['audioid'] ?? '', name: notification.data['name'] ?? '', // 优先取自定义data里的title,兜底用系统通知的标题值 title: notification.data['title'] ?? notification.notification?.title ?? '', ); // 插入列表头部,完全匹配泛型要求 fcmcrafts.insert(0, fcmContent); }); }
特殊场景适配
如果后端发送FCM消息时,没有把业务字段平铺在data顶层,而是把整个业务JSON字符串塞到了某个data字段里(比如存在data['biz_payload']键下),只需要多一步解码就能对接现有解析逻辑:
// 仅当后端传嵌套JSON字符串时才需要这段逻辑 final Map<String, dynamic> parsedData = jsonDecode(notification.data['biz_payload']); final fcmContent = FCMContent.fromJson(parsedData);
必须注意的踩坑点
- 别把自定义业务字段塞到
notification.notification的扩展字段里发送:FCM服务端在通知模式下会自动过滤所有非标准字段的自定义值,客户端根本收不到这类数据,所有自定义业务字段必须放在消息的data段下发。 - FCM的data字段值固定为String类型,刚好匹配你
FCMContent类里三个String字段的定义,不需要做额外的类型转换。
内容的提问来源于stack exchange,提问作者Meggy
相关产品推荐
相关产品推荐

