Как создать базовую фабрику и переопределить ее на дочернем классе во Flutter - PullRequest
3 голосов
/ 22 мая 2019

Итак, у меня есть класс, как 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);

Спасибо за ваше время.

1 Ответ

0 голосов
/ 22 мая 2019

я не знаю, правильно ли я вас понял, вот что я понял из вашего вопроса

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}');
}
...