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

时间:2019-05-22 06:15:34

标签: dart flutter factory abstract

所以我有一个像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);

谢谢您的时间。

2 个答案:

答案 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;
      }
    }