处理来自 Rest API 的分页响应的反序列化

问题描述 投票:0回答:1

我正在 Flutter 项目中设计几个模型类:

class ModelA { String titleA; /* ... */ }
class ModelB { String titleB; /* ... */ }

按照其他页面上的建议,我已向两者添加了“fromJson”方法:

class ModelA {
  String titleA;
  /* ... */
  factory ModelA.fromJson(Map<String, dynamic> json) {
    // json == {"titleA": "foo"}
    return switch (json) {
      {"titleA": String titleA} => ModelA(titleA),
      _ => throw const FormatException("failed to deserialize"),
    }
  }
}

(B型同理)

接下来我需要处理完整的 JSON 结构,如下所示:

  • 型号A
{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    { "titleA": "foo" },
    { "titleA": "bar" }
  ]
}
  • 型号B
{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    { "titleB": "foo" },
    { "titleB": "bar" }
  ]
}

为此,创建了以下类:

class Response <M> {
  int count;
  String? next;
  String? previous;
  List<M> results;
  Response(this.count, this.next, this.previous, this.results);
}

我希望工厂是这样的:

class Response <M> {
  int count;
  String? next;
  String? previous;
  List<M> results;
  Response(this.count, this.next, this.previous, this.results);
  factory Response.fromJson(Map<String, dynamic> json) {
    return switch (json) {
      {
        "count": int count,
        "next": String? next,
        "previous": String? previous,
        "results": List<dynamic> results,
      } => Response(count, next, previous, M.fromJsonDynList(results)),
      _ => throw const FormatException("failed to deserialize json into a Response"),
    };
  }
}

我的问题是:如何确保 M 类型有一个名为 fromJsonDynList 的静态方法?

我知道我们不能为此使用“抽象”。也许继承?我是这门语言的新手。欢迎任何建议。

json flutter dart deserialization
1个回答
0
投票

这种方法不适用于 Dart,原因有两个:

  1. 静态方法不是类接口的一部分。因此没有办法强制类定义特定的静态方法或工厂构造函数。

  2. 也没有规定使用泛型类型调用方法,例如

    M.fromJsonDynList(results)
    。这个特定问题之前已被问过:参见此答案

上面的链接提供了一个解决方法,即将一个函数传递给

Response
的构造函数,该函数可以创建
M
类型的对象。

© www.soinside.com 2019 - 2024. All rights reserved.