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

Flutter空安全迁移报错:期望List<ClassroomRoutineModel>却得List<dynamic>

解决Flutter空安全迁移中List类型不匹配问题

问题原因

错误提示Expected a value of type List<ClassroomRoutineModel>, but got one of type List<dynamic>,是因为从JSON解码出的列表是List<dynamic>类型,而ClassroomModel的classroomRoutines字段期望List<ClassroomRoutineModel>(或可空的List<ClassroomRoutineModel>?),空安全下Dart不会自动隐式转换这种集合类型,必须显式处理。

修改方案

1. 修正JSON转模型的类型转换

在_$ClassroomModelFromJson方法中,对classroomRoutines的处理需要显式将List<dynamic>转换为List<ClassroomRoutineModel>?,可以通过cast或类型断言实现:

ClassroomModel _$ClassroomModelFromJson(Map<String, dynamic> json) {
  return ClassroomModel(
    title: json['title'] as String,
    description: json['description'] as String,
    coverImage: json['coverImage'] as String,
    // 显式转换类型
    classroomRoutines: (json['classroomRoutines'] as List?)
        ?.map((e) => e == null
            ? null
            : ClassroomRoutineModel.fromJson(e as Map<String, dynamic>))
        ?.toList()
        ?.cast<ClassroomRoutineModel>(), // 用cast强制转换元素类型
    timeBetweenAsanas: json['timeBetweenAsanas'] as int,
    isPredefined: json['isPredefined'] as bool,
  );
}

如果确定classroomRoutines的元素不会为null,也可以简化为:

classroomRoutines: (json['classroomRoutines'] as List<dynamic>)
    .map((e) => ClassroomRoutineModel.fromJson(e as Map<String, dynamic>))
    .toList(),

(注意:如果JSON中可能存在null元素,不要用这种方式,避免抛出异常)

2. 修正模型转JSON的处理

在_$ClassroomModelToJson方法中,map返回的是Iterable,需要转为List才能正常序列化,同时处理可空情况:

Map<String, dynamic> _$ClassroomModelToJson(ClassroomModel instance) =>
    <String, dynamic>{
      'title': instance.title,
      'description': instance.description,
      'coverImage': instance.coverImage,
      'timeBetweenAsanas': instance.timeBetweenAsanas,
      'isPredefined': instance.isPredefined,
      // 处理可空并转为List
      'classroomRoutines': instance.classroomRoutines
          ?.map((e) => e?.toJson()) // 如果e可能为null,保留null
          ?.toList(),
    };

关键点说明

  • 空安全下,集合类型的泛型必须明确,Dart不再允许隐式的List<dynamic>到List<T>的转换
  • 使用cast<T>()可以安全地将List<dynamic>转换为List<T>,如果元素类型不匹配会在运行时抛出错误
  • 处理可空字段时,要确保每个链式调用都考虑了null的情况(比如?.操作符)

内容的提问来源于stack exchange,提问作者swing13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:20:01