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
相关产品推荐
相关产品推荐

