#dart #flutter
#dart #флаттер
Вопрос:
Я пытался написать абстрактный JsonSerializable
класс, чтобы иметь что-то вроде этого:
abstract class JsonSerializable<T>{
T fromMap(Map<String,dynamic> map);
Map<String,dynamic> toMap();
T fromJsonString(String jsonString){
return fromMap(json.decode(jsonString));
}
String toJsonString(){
return json.encode(toMap());
}
}
Моя первая проблема заключалась в том, что fromMap
и fromJsonString
не могут использоваться в качестве конструкторов, поэтому я подумал, что это может сделать что-то вроде этого:
class Foo extends JsonSerializable<Foo>{
Foo();
factory Foo.fromMap(Map<String,dynamic> map){
return fromMap(map);
}
@override
Foo fromMap(Map<String, dynamic> map) {
// TODO: implement fromMap
return null;
}
@override
Map<String, dynamic> toMap() {
// TODO: implement toMap
return null;
}
}
Теперь приведенный выше код вызывает жалобу Dart analyzer, поскольку я пытаюсь получить доступ к методу экземпляра из конструктора factory.
Итак, я подумал, что мог бы просто реализовать эти методы, не наследовая и не переопределяя их (я знаю, это грязное решение), но все же это не даст мне чего-то, что могло бы просто сказать: «Эй, у такого класса есть этот метод».
Я полностью упускаю смысл в этом?
Существует ли чистое решение, которое не включает плагины для генерации кода, которые, по-видимому, не поддерживают дженерики?
Мои ответы API имеют всю эту структуру:
{
"key1":"value1",
"otherStuffKey":["blah", "blah"],
"data": <the object I want to generalize>
}
Мне нужны дженерики, потому что я хотел бы проанализировать объект, сериализованный как data
значение, в разные классы, которые имеют одинаковое поведение.
PS: Методы toMap
and toJsonString
бесполезны, если я собираюсь проанализировать ответ, но они были бы очень полезны для завершения круга и позволяют использовать это JsonSerializable
и для сериализации запросов.
Комментарии:
1. что вы имеете в виду?
2. о, да, я знаю, на самом деле это одна из моих проблем