所以我有一个像Question
这样的类,如下:
@JsonSerializable()
class Question {
String id;
String content;
Question({this.id, this.content});
factory Question.fromJson(Map<String, dynamic> json) =>
_$QuestionFromJson(json);
Map<String, dynamic> toJson() => _$QuestionToJson(this);
}
请记住,这些_$QuestionFromJson
和_$QuestionToJson
来自此库https://pub.dev/packages/json_serializable
说我有很多类似的类,它们具有fromJson工厂和toJson方法。我想创建一个包含那些2方法的基类。基本模型对于toJson来说很容易:
abstract class BaseModel {
Map<String, dynamic> toJson();
}
但是工厂方法呢,我不知道如何声明它们,然后像下面这样简单地覆盖它:
@override
factory Question.fromJson(Map<String, dynamic> json) =>
_$QuestionFromJson(json);
编辑:
我使用它的想法是因为我想创建一个转换器实用程序,我只需要传递类似Converter.listFromJson<MyClass>(jsonString)
这样的结果类。现在,帮助程序是:
static List<T> listFromJson<T>(jsonString, Function mappingFunction) {
return myJsonMap.map(mappingFunction).cast<T>().toList();
}
所以我每次使用此辅助方法时都必须通过传递map函数来映射每个项目:
Converter.listFromJson<Question>(
jsonMap, (item) => Question.fromJson(item));
还有更多此类需要转换为列表。我想重用没有(item) => Question.fromJson(item)
方法部分的方法。这就是为什么我要创建一个具有fromJson方法的工厂的基类,以便可以在转换器中使用它
return myJsonMap.map((item) => BaseModel.fromJson(item)).cast<T>().toList();
然后我只需打电话
Converter.listFromJson<Question>(jsonMap);
谢谢您的时间。
答案 0 :(得分:0)
我不知道我是否正确理解了你,这就是我从你的问题中了解的
abstract class BaseModel{
BaseModel();
BaseModel.fromJson(Map<String,dynamic> json);
}
class Question extends BaseModel{
final String id;
final String name;
Question({this.id,this.name}): super();
@override
factory Question.fromJson(Map<String, dynamic> json) {
return Question(
id: json['id'],
name: json['name']
);
}
}
void main(){
Map<String,dynamic> json = {'id': "dsajdas",'name': 'test'};
Question question = Question.fromJson(json);
print('question: ${question.id}');
}
答案 1 :(得分:0)
这是我的方法,但你不能做这样的事情。通过在变量中声明 .fromJson(json) 有一种解决方法。看看我的示例代码,希望你能有所了解。
class Categories {
final String id;
String name;
String image;
Categories({this.id, this.name, this.image});
Categories.fromJson(dynamic json)
: id = json['id'],
name = json['name'],
image = json['image'];
}
class CategoriesModel extends AppModel<Categories> {
List<Categories> list = [];
Function fromJson = (dynamic json) => Categories.fromJson(json);
}
class AppModel<T> {
List<T> list = [];
Function fromJson;
List<T> getList() {
if (this.list.isNotEmpty) return this.list;
List<dynamic> list = GetStorage().read('tableName');
list.forEach((data) {
this.list.add(fromJson(data));
});
return this.list;
}
}