Итак, у меня есть класс, как 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 метода. Базовая модель проста для Джонсона, как показано ниже:
abstract class BaseModel {
Map<String, dynamic> toJson();
}
Но как насчет фабричного метода, я понятия не имею, как их объявить, а затем переопределить его просто так:
@override
factory Question.fromJson(Map<String, dynamic> json) =>
_$QuestionFromJson(json);
EDIT:
Моя идея использования этого заключается в том, что я хочу создать утилиту-конвертер, которую мне нужно передать только в классе результата, например Converter.listFromJson<MyClass>(jsonString)
. На данный момент, помощник:
static List<T> listFromJson<T>(jsonString, Function mappingFunction) {
return myJsonMap.map(mappingFunction).cast<T>().toList();
}
, поэтому мне нужно отображать каждый элемент, передавая функцию карты каждый раз, когда я использую этот вспомогательный метод:
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);
Спасибо за ваше время.