如何创建基础工厂并在 Flutter 中的子类上覆盖它

Tra*_*Nam 9 factory abstract dart flutter

所以我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

请记住,那些_$QuestionFromJson_$QuestionToJson来自这个库https://pub.dev/packages/json_serializable

假设我有很多类似的类,它们有一个 fromJson 工厂和一个 toJson 方法。我想创建一个包含这两种方法的基类。基本模型对于 toJson 来说很容易,如下所示:

abstract class BaseModel {
  Map<String, dynamic> toJson();
}
Run Code Online (Sandbox Code Playgroud)

但是工厂方法呢,我不知道如何声明它们然后简单地像这样覆盖它:

@override
factory Question.fromJson(Map<String, dynamic> json) =>
      _$QuestionFromJson(json);
Run Code Online (Sandbox Code Playgroud)

编辑: 我使用它的想法是因为我想创建一个转换器实用程序,我只需要传递像Converter.listFromJson<MyClass>(jsonString). 现在,助手是:

static List<T> listFromJson<T>(jsonString, Function mappingFunction) {
   return myJsonMap.map(mappingFunction).cast<T>().toList();
}
Run Code Online (Sandbox Code Playgroud)

所以我每次使用这个辅助方法时都必须通过传递 map 函数来映射每个项目:

Converter.listFromJson<Question>(
          jsonMap, (item) => Question.fromJson(item));
Run Code Online (Sandbox Code Playgroud)

还有一些类需要像这样转换为列表。我想重用没有(item) => Question.fromJson(item)方法部分的方法。这就是为什么我想创建一个具有工厂 fromJson 方法的基类,以便我可以在转换器中使用它

return myJsonMap.map((item) => BaseModel.fromJson(item)).cast<T>().toList();
Run Code Online (Sandbox Code Playgroud)

然后我只是简单地打电话

Converter.listFromJson<Question>(jsonMap);
Run Code Online (Sandbox Code Playgroud)

感谢您的时间。

Sam*_*ani 4

我不知道我是否正确理解了你的意思,这就是我从你的问题中了解到的

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}');
}
Run Code Online (Sandbox Code Playgroud)