为何工厂构造函数无法访问实例成员?附类型匹配报错求助
解决Flutter/Dart中的两个报错问题
报错1:Instance members can't be accessed from a factory constructor
- 问题原因:
_convertVaccinations是实例方法,工厂构造函数属于类的静态上下文,无法直接调用实例成员。 - 解决方法:给
_convertVaccinations方法添加static关键字,将其转为静态方法,这样工厂构造函数就能正常调用。
报错2:The argument type 'List<Map<String, dynamic>>?' can't be assigned to the parameter type 'List'
- 问题原因:当前
_convertVaccinations的逻辑是把Vaccination实例转成Map(反向序列化),但实际需要的是把JSON中的动态列表转成List<Vaccination>(正向序列化),逻辑完全倒置,同时返回类型和Pet类的vaccination字段类型不匹配。 - 解决方法:
- 修改
_convertVaccinations的返回类型为List<Vaccination>,因为Pet的vaccination是必填的非空列表。 - 调整方法内部逻辑:遍历传入的JSON列表,用
Vaccination.fromJson(假设Vaccination类实现了该工厂构造函数)将每个Map<String, dynamic>元素转为Vaccination实例。 - 处理参数为
null的情况,返回空列表而非null,确保符合非空字段要求。
- 修改
额外类型安全修正
notes和referenceId是可空的String?,转换JSON时需用as String?而非as String,避免null值导致类型转换错误。- 调用
_convertVaccinations时,将json['vaccinations'] as List<dynamic>改为json['vaccinations'] as List<dynamic>?,兼容JSON中无该字段的场景。
修改后的完整代码
final String name; final String? notes; final String type; final List<Vaccination> vaccination; final String? referenceId; Pet(this.name, {this.notes, required this.type, required this.vaccination, this.referenceId}); factory Pet.fromJson(Map<String, dynamic> json) => Pet( json['name'] as String, notes: json['notes'] as String?, type: json['types'] as String, // 注意:此处若为笔误,可根据实际JSON结构改为json['type'] referenceId: json['referenceId'] as String?, vaccination: _convertVaccinations(json['vaccinations'] as List<dynamic>?)); static List<Vaccination> _convertVaccinations(List<dynamic>? vaccinations) { if (vaccinations == null) { return []; } else { final vaccinationList = <Vaccination>[]; for (var element in vaccinations) { vaccinationList.add(Vaccination.fromJson(element as Map<String, dynamic>)); } return vaccinationList; } }
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

