You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:28:15