gpt4 book ai didi

flutter - 带有子列表的整洁架构 toJson(reso 编码器)

转载 作者:行者123 更新时间:2023-12-05 04:55:09 24 4
gpt4 key购买 nike

我正在尝试在我的项目中使用整洁的架构(由 reso 编码器解释:https://resocoder.com/2019/09/09/flutter-tdd-clean-architecture-course-4-data-layer-overview-models/)。

在他的示例中,他实现了一个实体和一个扩展该实体的模型。该实体具有所有属性,并且该模型实现了 fromJson 和 toJson 方法。

它适用于“扁平”类。

但现在我想为具有另一个类列表的类实现它。

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;
}

当然它不起作用,因为类项没有方法“toJson”。

正确的实现方式是什么?在 toJson 方法中将 List 转换为 List?

编辑

当我尝试将列表项转换为 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 类抽象并添加抽象方法 fromJson a 和 toJson

abstract class Item {
//...

Item fromJson(Map json); // abstract method
Map<String, dynamic> toJson(); // abstract method

}

关于flutter - 带有子列表的整洁架构 toJson(reso 编码器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65541985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com