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

为何工厂构造函数无法访问实例成员?附类型匹配报错求助

解决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字段类型不匹配。
  • 解决方法:
    1. 修改_convertVaccinations的返回类型为List<Vaccination>,因为Pet的vaccination是必填的非空列表。
    2. 调整方法内部逻辑:遍历传入的JSON列表,用Vaccination.fromJson(假设Vaccination类实现了该工厂构造函数)将每个Map<String, dynamic>元素转为Vaccination实例。
    3. 处理参数为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:45:35