如何在Dart中为嵌套Map创建接口(类)



在我的Flutter应用程序中,我收到带有自定义有效负载的通知,如:

{ notification: 
{ 
title: Test, 
body: AAAA 
}, 
data: 
{ 
productId: Axe, 
page: Products, 
click_action: FLUTTER_NOTIFICATION_CLICK
}
}

一切都很好。我还可以通过以下方式访问通知的有效负载:message['data']['page']

但我更愿意使用接口/类来按键命名数据,例如:CCD_ 2和CCD_ 3

所以我尝试了:

class NotificationMessage {
Map notification;
Map data;
NotificationMessage(this.notification, this.data);
}
...
NotificationMessage _message = message; // Assigning the payload to the final
...

这是我陷入困境的地方:这里我得到了错误:类型为'Map<动态,动态>'无法将其分配给"NotificationMessage"类型的变量

我的课还没上完,但怎么继续呢?我知道json_serializable,但在使用任何工具之前,我想完全理解它。

首先,您需要构建通知和数据的两个模型,如下

class DataMessage {
final String productId;
final String page;
final String click_action;
DataMessage(this.productId, this.page, this.click_action);
factory DataMessage.fromJson(Map<dynamic, dynamic> json) {
return DataMessage(
json['productId'] as String,
json['page'] as String,
json['click_action'] as String,
);
}
} 
class NotificationMessage {
final String title;
final String body;
NotificationMessage(this.title, this.body);
factory NotificationMessage.fromJson(Map<dynamic, dynamic> json) {
return NotificationMessage(
json['title'] as String,
json['body'] as String,
);
}
}

工厂方法将映射类型转换为模型类。

然后,您必须为响应消息建立一个模型,如下所示

class Message {
final NotificationMessage notification;
final DataMessage data;
Message(this.notification, this.data);
factory Message.fromJson(Map<dynamic, dynamic> json) {
final Map<dynamic, dynamic> mapNotification = json['notification'];
final Map<dynamic, dynamic> mapData = json['data'];

final dataModel = DataMessage.fromJson(mapData);
final notificationModel = NotificationMessage.fromJson(mapNotification);

return Message(
notificationModel as NotificationMessage,
dataModel as DataMessage,
);
}
}

注意,工厂方法允许您将每个模型的映射转换为类模型

因此,您可以将您的响应定义为类

Map<dynamic, dynamic> messageResponse = {
'notification': {'title': 'Test', 'body': 'AAAA'},
'data': {
'productId': 'Axe',
'page': 'Products',
'click_action': 'FLUTTER_NOTIFICATION_CLICK'
}
};
final Message message = Message.fromJson(messageResponse);
print(message.data.productId);
print(message.data.page);
print(message.data.click_action);

print(message.notification.title);
print(message.notification.body);

希望能帮助你

json对象的实例。通过这种方式,您可以在不修改类的情况下为任何实例使用映射
{ "notification": 
{ 
"title": "Test", 
"body": "AAAA" 
}, 
"data": 
{ 
"productId": "Axe", 
"page": "Products", 
"click_action": "FLUTTER_NOTIFICATION_CLICK"
}
}

阶级看起来像;

class NotificationMessage {
NotificationMessage({
this.notification,
this.data,
});
final Notification notification;
final Data data;
factory NotificationMessage.fromJson(Map<String, dynamic> json) => NotificationMessage(
notification: Notification.fromJson(json["notification"]),
data: Data.fromJson(json["data"]),
);
Map<String, dynamic> toJson() => {
"notification": notification.toJson(),
"data": data.toJson(),
};
}
class Data {
Data({
this.productId,
this.page,
this.clickAction,
});
final String productId;
final String page;
final String clickAction;
factory Data.fromJson(Map<String, dynamic> json) => Data(
productId: json["productId"],
page: json["page"],
clickAction: json["click_action"],
);
Map<String, dynamic> toJson() => {
"productId": productId,
"page": page,
"click_action": clickAction,
};
}
class Notification {
Notification({
this.title,
this.body,
});
final String title;
final String body;
factory Notification.fromJson(Map<String, dynamic> json) => Notification(
title: json["title"],
body: json["body"],
);
Map<String, dynamic> toJson() => {
"title": title,
"body": body,
};
}

作为构建的功能

Future<NotificationMessage> getNotf() {
var parsedJson = json.decode(//your received object);
return NotificationMessage.fromJson(parsedJson);
}

现在你可以在这样的构建器中收到这个

_futureNotifications =Future<NotificationMessage>
_futureNotifications = getNotf(); //this is a function and can be used after a gesture or initState
FutureBuilder<NotificationMessage>(
future: _futureNotifications,
builder: (context, snapshot) {
}

最新更新