Flutter - 使用json_serializable反序列化firebase_messagin通知

问题描述 投票:0回答:1

我在我的应用程序中的所有模型上使用Json_serializable(它使用命令行自动向我的模型提供fromJson和toJson方法)。

每个(de)序列化都可以正常工作,但不能使用firebase_messaging json。

这是我做的:

onMessage: (Map<String, dynamic> msg) {
  FCMNotification fcmNotification = FCMNotification.fromJson(msg);
}

我总是有这样的错误:

类型'String'不是类型转换中类型为'Map <dynamic,dynamic>'的子类型

要么

'_InternalLinkedHashMap <dynamic,dynamic>'不是'Map <String,dynamic>'类型的子类型

我在github here看到过这种问题,但我找不到任何解决方案。请帮忙

json flutter firebase-cloud-messaging
1个回答
0
投票

我找到了问题和解决方案。

Firebase云消息传递通知以地图形式接收。

地图的结构如下:

{
"registration_ids": ["registrationID1, "registrationID2", ...],
"notification": {
  "title": "New message",
  "body": "new message in channel: test"
},
"data": {
  "type": "CHANNEL_MESSAGE",
  "author": {
    "id": 5,
    "firstName": "John",
    "lastName": "Doe",
    "email": "[email protected]",
    "userType": "USER",
    "language": "EN"
  },
}

}

我们可以把我们想要的东西放在“数据”中。就我而言,我有一个作者对象。此对象在地图中创建了一个附加级别。 Firebase Cloud Messaging认为所有额外级别值都是String。

因此,我们可以使用传统的'fromJson(json)'方法反序列化'data',但是如果我们想要反序列化'author',我们必须首先解码Json,就像那样:

String jsonAuthorStr = msg["data"]["author"];
Map<String, dynamic> temp = json.decode(jsonAuthorStr);

然后,反序列化:

Author author = Author.fromJson(temp);
© www.soinside.com 2019 - 2024. All rights reserved.