带有子列表的干净架构 toJson(reso 编码器)
clean architecture toJson with sublist (reso coder)
我正在尝试在我的项目中使用干净的架构(由 reso 编码器解释:https://resocoder.com/2019/09/09/flutter-tdd-clean-architecture-course-4-data-layer-overview-models/)。
在他的示例中,他实现了一个实体和一个扩展该实体的模型。
实体具有所有属性,模型实现了 fromJson 和 toJson 方法。
它适用于“扁平”classes。
但现在我想为一个 class 实现它,它有另一个 class.
的列表
class Item {
String text;
}
class ItemModel extends Item{
...toJson
...romJson
}
class Order {
...
List<Item> items;
}
class OrderModel extends Item {
...
...fromJson() {
if (json['items'] != null) {
teams = new List<ItemModel>();
json['items'].forEach((v) {
items.add(Item.fromJson(v));
});
}
}
}
...toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items!= null) {
data['items'] = this.items.map((v) => v.toJson()).toList();
}
return data;
}
当然不行,因为 class 项没有方法“toJson”。
正确的实现方式是什么?在 toJson 方法中将列表转换为列表?
编辑
当我尝试将列表项转换为 ItemModel 并且列表中有一个 Item 时,抛出异常:
type 'Item' is not a subtype of type 'ItemModel' in type cast
我现在认为以下是正确的:
向 ItemModel 添加工厂方法,将 Item 转换为 ItemModel:
fromItem(Item item){
if(item is ItemModel) {
return item as ItemModel;
}
return ItemModel(..: item...);
}
这是解决这个问题的最佳方法吗?
您使用的是 Item.fromJson
而不是 ItemModel.fromJson
?你试过这个吗?
class OrderModel extends Item {
...
...fromJson() {
if (json['items'] != null) {
teams = new List<ItemModel>();
json['items'].forEach((v) {
items.add(ItemModel.fromJson(v));
});
}
}
}
编辑
如果你直接在 Item 上调用 toJson,你可以将它的值转换为 ItemModel 如下
...toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items != null) {
data['items'] = this.items.map((v) => (v as ItemModel).toJson()).toList();
}
return data;
}
编辑 2
使您的 Item class 抽象并添加抽象方法 fromJson a 和 toJson
abstract class Item {
//...
Item fromJson(Map json); // abstract method
Map<String, dynamic> toJson(); // abstract method
}
我现在用下面的方法解决了
我在模型中添加了一个方法class 以将实体转换为模型
factory ItemModel.fromItem(Item item) {
if (item is ItemModel) {
return item;
}
return ItemModel(
text: item.text,
);
}
并适配toJson方法
...toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items != null) {
data['items'] = this.items.map((v) => ItemModel.fromItem(v).toJson()).toList();
}
return data;
}
我正在尝试在我的项目中使用干净的架构(由 reso 编码器解释:https://resocoder.com/2019/09/09/flutter-tdd-clean-architecture-course-4-data-layer-overview-models/)。
在他的示例中,他实现了一个实体和一个扩展该实体的模型。 实体具有所有属性,模型实现了 fromJson 和 toJson 方法。
它适用于“扁平”classes。
但现在我想为一个 class 实现它,它有另一个 class.
的列表class Item {
String text;
}
class ItemModel extends Item{
...toJson
...romJson
}
class Order {
...
List<Item> items;
}
class OrderModel extends Item {
...
...fromJson() {
if (json['items'] != null) {
teams = new List<ItemModel>();
json['items'].forEach((v) {
items.add(Item.fromJson(v));
});
}
}
}
...toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items!= null) {
data['items'] = this.items.map((v) => v.toJson()).toList();
}
return data;
}
当然不行,因为 class 项没有方法“toJson”。
正确的实现方式是什么?在 toJson 方法中将列表转换为列表?
编辑
当我尝试将列表项转换为 ItemModel 并且列表中有一个 Item 时,抛出异常:
type 'Item' is not a subtype of type 'ItemModel' in type cast
我现在认为以下是正确的: 向 ItemModel 添加工厂方法,将 Item 转换为 ItemModel:
fromItem(Item item){
if(item is ItemModel) {
return item as ItemModel;
}
return ItemModel(..: item...);
}
这是解决这个问题的最佳方法吗?
您使用的是 Item.fromJson
而不是 ItemModel.fromJson
?你试过这个吗?
class OrderModel extends Item {
...
...fromJson() {
if (json['items'] != null) {
teams = new List<ItemModel>();
json['items'].forEach((v) {
items.add(ItemModel.fromJson(v));
});
}
}
}
编辑
如果你直接在 Item 上调用 toJson,你可以将它的值转换为 ItemModel 如下
...toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items != null) {
data['items'] = this.items.map((v) => (v as ItemModel).toJson()).toList();
}
return data;
}
编辑 2
使您的 Item class 抽象并添加抽象方法 fromJson a 和 toJson
abstract class Item {
//...
Item fromJson(Map json); // abstract method
Map<String, dynamic> toJson(); // abstract method
}
我现在用下面的方法解决了
我在模型中添加了一个方法class 以将实体转换为模型
factory ItemModel.fromItem(Item item) {
if (item is ItemModel) {
return item;
}
return ItemModel(
text: item.text,
);
}
并适配toJson方法
...toJson(){
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.items != null) {
data['items'] = this.items.map((v) => ItemModel.fromItem(v).toJson()).toList();
}
return data;
}