首页 > 解决方案 > 带有子列表的干净架构 toJson (reso coder)

问题描述

我正在尝试在我的项目。

在他的示例中,他实现了一个实体和一个扩展该实体的模型。实体具有所有属性,模型实现了 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...);
  }

这是解决这个问题的最好方法吗?

标签: flutterdartclean-architecture

解决方案


您正在使用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
   
}

推荐阅读