Flutter实体继承报错:List属性重写无效问题求助
解决Dart中Entity与Model继承时的ratings属性重写错误
我来帮你拆解这个问题的根源和对应的解决方案:
错误原因
你的ResultMovieDetailsEntity中ratings的setter类型是void Function(List<ResultMoviesRatings>),但子类ResultMovieDetailsModel里的ratings setter变成了不带泛型的void Function(List)——泛型的缺失导致类型不匹配,Dart的强类型系统不允许这种不严格的重写,所以抛出了dartinvalid_override错误。
接下来分几种场景给你解决方案:
场景1:Model不需要修改ratings的泛型类型
如果你的Model只是对Entity做序列化封装,不需要把ratings转换成另一个Model类型,直接修正Model中ratings的类型定义,和父类完全一致即可:
// 父类 Entity class ResultMovieDetailsEntity { String? title; String? poster; List<ResultMoviesRatings>? _ratings; set ratings(List<ResultMoviesRatings>? value) => _ratings = value; List<ResultMoviesRatings>? get ratings => _ratings; } class ResultMoviesRatings {} // 子类 Model class ResultMovieDetailsModel extends ResultMovieDetailsEntity { // 确保重写的setter/getter类型和父类完全一致 @override set ratings(List<ResultMoviesRatings>? value) { super.ratings = value; // 这里可以添加Model特有的处理逻辑,比如类型转换 } @override List<ResultMoviesRatings>? get ratings => super.ratings; // Json序列化方法 factory ResultMovieDetailsModel.fromJson(Map<String, dynamic> json) { return ResultMovieDetailsModel() ..title = json['title'] ..poster = json['poster'] ..ratings = (json['ratings'] as List?) ?.map((e) => ResultMoviesRatingsModel.fromJson(e) as ResultMoviesRatings) .toList(); } Map<String, dynamic> toJson() { return { 'title': title, 'poster': poster, 'ratings': ratings?.map((e) => (e as ResultMoviesRatingsModel).toJson()).toList(), }; } } class ResultMoviesRatingsModel extends ResultMoviesRatings { factory ResultMoviesRatingsModel.fromJson(Map<String, dynamic> json) => ResultMoviesRatingsModel(); Map<String, dynamic> toJson() => {}; }
场景2:Model需要将ratings转换为子类型列表
如果你的ResultMoviesRatingsModel是ResultMoviesRatings的子类,且希望Model的ratings是List<ResultMoviesRatingsModel>,可以用covariant关键字让Dart允许子类用子类型重写父类的setter:
// 父类 Entity - 添加covariant关键字允许子类型重写 class ResultMovieDetailsEntity { String? title; String? poster; List<ResultMoviesRatings>? _ratings; set ratings(covariant List<ResultMoviesRatings>? value) => _ratings = value; List<ResultMoviesRatings>? get ratings => _ratings; } class ResultMoviesRatings {} // 子类 Model class ResultMovieDetailsModel extends ResultMovieDetailsEntity { List<ResultMoviesRatingsModel>? _modelRatings; @override set ratings(List<ResultMoviesRatingsModel>? value) { _modelRatings = value; // 同步到父类的属性(如果需要) super.ratings = value; } @override List<ResultMoviesRatingsModel>? get ratings => _modelRatings; factory ResultMovieDetailsModel.fromJson(Map<String, dynamic> json) { return ResultMovieDetailsModel() ..title = json['title'] ..poster = json['poster'] ..ratings = (json['ratings'] as List?) ?.map((e) => ResultMoviesRatingsModel.fromJson(e)) .toList(); } Map<String, dynamic> toJson() { return { 'title': title, 'poster': poster, 'ratings': _modelRatings?.map((e) => e.toJson()).toList(), }; } } class ResultMoviesRatingsModel extends ResultMoviesRatings { factory ResultMoviesRatingsModel.fromJson(Map<String, dynamic> json) => ResultMoviesRatingsModel(); Map<String, dynamic> toJson() => {}; }
场景3:更灵活的泛型方案
如果想让Entity支持多种ratings类型,把Entity改成泛型类是更优雅的选择:
// 泛型父类 Entity class ResultMovieDetailsEntity<T extends ResultMoviesRatings> { String? title; String? poster; List<T>? ratings; } class ResultMoviesRatings {} // 子类 Model - 指定泛型类型为ResultMoviesRatingsModel class ResultMovieDetailsModel extends ResultMovieDetailsEntity<ResultMoviesRatingsModel> { factory ResultMovieDetailsModel.fromJson(Map<String, dynamic> json) { return ResultMovieDetailsModel() ..title = json['title'] ..poster = json['poster'] ..ratings = (json['ratings'] as List?) ?.map((e) => ResultMoviesRatingsModel.fromJson(e)) .toList(); } Map<String, dynamic> toJson() { return { 'title': title, 'poster': poster, 'ratings': ratings?.map((e) => e.toJson()).toList(), }; } } class ResultMoviesRatingsModel extends ResultMoviesRatings { factory ResultMoviesRatingsModel.fromJson(Map<String, dynamic> json) => ResultMoviesRatingsModel(); Map<String, dynamic> toJson() => {}; }
这样既保证了类型安全,又能灵活适配不同的ratings子类型。
内容的提问来源于stack exchange,提问作者Lucas Bersot
相关产品推荐
相关产品推荐

