我正在 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 结构,如下所示:
{
"count": 1,
"next": null,
"previous": null,
"results": [
{ "titleA": "foo" },
{ "titleA": "bar" }
]
}
{
"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 的静态方法?
我知道我们不能为此使用“抽象”。也许继承?我是这门语言的新手。欢迎任何建议。
这种方法不适用于 Dart,原因有两个:
静态方法不是类接口的一部分。因此没有办法强制类定义特定的静态方法或工厂构造函数。
也没有规定使用泛型类型调用方法,例如
M.fromJsonDynList(results)
。这个特定问题之前已被问过:参见此答案。
上面的链接提供了一个解决方法,即将一个函数传递给
Response
的构造函数,该函数可以创建M
类型的对象。