flutter - 如何重用模型作为父模型

标签 flutter dart

我得到一个 json响应示例格式如下

// call 1 : /all-users
{
  "success": true,
  "message": "All Users list",
  "data": [{
    "code": "USR001",
    "name": "User One"
  }]
}


// call 2 - /user-details/USR001
{
  "success": true,
  "message": "User Details of USR001",
  "data": {
    "code": "USR001",
    "firstName": "User",
    "lastName": "One",
    "email": "userOne@email.com",
  }
}
还有我的 ApiResponse模型是
class ApiResponse {
  bool success;
  String message;
  List<Data> data;

  ApiResponse({this.success, this.message, this.data});

  ApiResponse.fromJson(Map<String, dynamic> json) {
    success = json['success'];
    message = json['message'];
    if (json['data'] != null) {
      data = new List<Data>();
      json['data'].forEach((v) {
        data.add(new Data.fromJson(v));
      });
    }
  }
}
data在响应中可能是一个对象或数组取决于调用。我想重用 ApiResponse通过扩展 data 为两个调用建立模型作为单独的模型。但我不知道该怎么做。

最佳答案

我认为最简单的方法是简单地拥有两个扩展 ApiResponse 的类。 ,并且两者都可以调用您的 super.fromJson。由于数据会有所不同,您可以执行以下两种操作之一:

  • data导出到新的派生类中,并在它们的构造函数中单独解析它
  • ApiResponse进入具有泛型的类( ApiResponse<T> ,其中 data 的类型为 T )。如果您采用这种方法,您还必须传递一个可以解析数据 json 的函数。

  • 就我个人而言,我认为为此使用泛型有点矫枉过正,但我​​想提一下它作为一种可能的解决方案。考虑到这一点,您可以执行以下操作:
    class ApiResponseBase {
      bool success;
      String message;
    
      ApiResponse({this.success, this.message});
    
      ApiResponse.fromJson(Map<String, dynamic> json) {
        success = json['success'];
        message = json['message'];
      }
    }
    
    class ApiResponseArray extends ApiResponseBase {
      List<Data> data;
    
      ApiResponseArray.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
        if (json['data'] != null) {
          json['data'].forEach((v) {
            data.add(new Data.fromJson(v));
          });
        }
      }
    }
    
    class ApiResponseObject extends ApiResponseBase {
      Data data;
    
      ApiResponseObject.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
        if (json['data'] != null) {
          data = new Data.fromJson(json['data']);
        }
      }
    }
    
    请注意我是如何从 ApiResponseBase 中删除数据的因为它现在正在派生类中解析。
    如果你真的不喜欢现在有两种数据定义的事实,你可以使用泛型而不需要增加复杂性:
    class ApiResponseBase<T> {
      bool success;
      String message;
      T data;
      // same as before 
    }
    
    class ApiResponseArray extends ApiResponseBase<List<Data>> {
      // same as before
    }
    
    class ApiResponseObject extends ApiResponseBase<Data> {
      // same as before
    }
    
    但无论哪种方式都有效。

    关于flutter - 如何重用模型作为父模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642039/

    相关文章:

    flutter - 必须向 Text 小部件提供非空字符串。错误

    firebase - Flutter:如何使用先前的状态更新 Firestore 中的数据

    android - linux 上的 CMake 错误(Android Studio 中的 Flutter 项目)

    dart - 阻止访问 Dart 中的某些库

    dart - 在 Dart 中将类类型作为变量传递

    image - 如何从用 CustomPainter 绘制的 Canvas 中获取图像?

    json - 将 Firebase 中的数据序列化为 Flutter 的 Dart 对象的最佳方法是什么?

    flutter - 使用Flutter计算两个日期之间的天数

    dart - 防止滚动的英雄跳到应用栏顶部

    flutter - 是否也可以最小化对象定义(折叠对象代码)(特别是 Dart with flutter)(Android Studio)