Flutter嵌套Model转Entity报错:列表类型不匹配问题求助
问题根源
Dart泛型是不变的——哪怕PageModel继承自Page,List<PageModel>也不属于List<Page>的子类型。你的PostModel直接用List<PageModel>定义pages字段,Freezed生成的代码会尝试重写父类Post的List<Page> pages属性,类型不匹配就触发了报错。
解决方案
以下是几种可行的解决方式,可根据业务场景选择:
方式1:给父类Post的pages字段添加covariant关键字
修改Post实体类,在pages字段前加covariant放宽类型检查限制,允许子类用子类型列表覆盖父类属性:
class Post { final String id; final String title; final String body; final covariant List<Page> pages; // 添加covariant关键字 Post({ required this.id, required this.title, required this.body, required this.pages, }); }
这种方式不需要修改PostModel代码,Freezed生成的代码就能正常重写pages属性。注意:如果直接给Post的pages添加非PageModel类型的元素,在PostModel中会触发类型错误,业务上要确保pages列表仅包含PageModel实例。
方式2:拆分字段,自定义getter重写父类属性
在PostModel中用新字段存储List<PageModel>,再重写父类的pages getter返回转换后的列表:
@freezed class PostModel extends Post with _$PostModel { const PostModel._(); // 必须定义私有构造函数,用于自定义getter const factory PostModel({ required String id, required String title, required String body, required List<PageModel> pageModels, // 改用新字段名 }) = _PostModel; // 重写父类pages getter,转换类型 @override List<Page> get pages => pageModels.cast<Page>(); factory PostModel.fromJson(Map<String, Object?> json) => _$PostModelFromJson(json); }
这种方式无需修改父类Post,cast<Page>()是安全操作,因为PageModel继承自Page。
方式3:将Post改为抽象类,定义getter接口
把Post改为抽象类,将所有属性定义为getter,并给pages添加covariant:
abstract class Post { String get id; String get title; String get body; covariant List<Page> get pages; }
之后PostModel可直接保留原有代码实现该抽象类,Freezed会自动生成符合要求的getter代码,不会出现类型不匹配问题。
内容的提问来源于stack exchange,提问作者akshay bhange
相关产品推荐
相关产品推荐

