【问题标题】:clean architecture toJson with sublist (reso coder)带有子列表的干净架构 toJson (reso coder)
【发布时间】:2021-01-02 17:24:28
【问题描述】:

我正在尝试在我的项目中使用干净的架构(由 reso coder 解释: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...);
  }

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

【问题讨论】:

    标签: flutter dart clean-architecture


    【解决方案1】:

    您使用的是 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
       
    }
    

    【讨论】:

    • 哇,这一天真长。
    • 对不起,我发布了错误的方法。 fromJson 方法没问题。但我有 toJson 的问题
    • 好的,但是可以不加任何检查地投射它吗?该列表中可能有一个没有 toJson 方法的 Item。
    • 老大,ItemModel直接扩展Item。将Item 转换为ItemModel 没有任何问题
    • 另一种方法是我在您的Item 课程中使用abstract method。所以任何扩展它的类都必须实现..fromJson..toJson
    【解决方案2】:

    我现在通过以下方式解决了它。

    我已经向模型类添加了一个方法来将实体转换为模型

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

    【讨论】:

    • 嗨,您的解决方案仍然是您的首选方式,还是您同时想出了更“优雅”的方法?我刚刚在这里提出了一个类似的问题:stackoverflow.com/questions/68624601/…
    • 嗨,是的,这仍然是我的首选方式。
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2022-01-09
    • 2020-02-17
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2013-05-24
    相关资源
    最近更新 更多