Dart中'dynamic'无法赋值给'Iterable<dynamic>'分析错误问询
解决Dart Freezed解析JSON的类型错误问题
问题背景
使用Freezed定义的UserModel解析服务器返回的JSON响应,代码能正常获取数据,但Android Studio提示分析错误;尝试强制类型转换后又出现运行时类型不匹配错误。
原解析代码
@freezed abstract class UserModel with _$UserModel { const factory UserModel({ required int id, @JsonKey(name: 'name_family') required String nameFamily, @JsonKey(name: 'mobile_number') required String mobileNumber, @JsonKey(name: 'baker_profile') required BakerProfileModel bakerProfile, }) = _UserModel; factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json); } final onlineBakers = List<UserModel>.from( success['data'].map( (data) => UserModel.fromJson(data as Map<String, dynamic>), ), ).toList();
第一个错误(分析阶段)
The argument type 'dynamic' can't be assigned to the parameter type 'Iterable
'
错误指向success['data'].map(...)代码段。
尝试强制转换后的代码
final onlineBakers = List<UserModel>.from( success['data'].map( (data) => UserModel.fromJson(data as Map<String, dynamic>), ) as List<UserModel>, ).toList();
第二个错误(运行时)
type 'MappedListIterable<dynamic, dynamic>' is not a subtype of type 'List
' in type cast
服务器返回的JSON响应
[ { "id": 6, "user_type": "baker", "name_family": "test", "mobile_number": "09087549785", "active": 1, "baker_profile": { "id": 9, "user_id": 6, "province_id": 19, "city_id": 729, "neighbourhood_id": 2, "profile_image": "baker_profiles_images/pUZtdPNCKoQnXbKWBwUnciK7Yo01fG1IMUggzgVK.png", "store_image": "baker_stores_images/pUZtdPNCKoQnXbKWBwUnciK7Yo01fG1IMUggzgVK.png", "store_name": "test", "status": 1, "peyk_price": 0, "minimum_order": 1, "maximum_order": 1, "maximum_queue_count": 1, "morning_start_time": 1, "morning_end_time": 1, "afternoon_start_time": 1, "afternoon_end_time": 1, "active": 1, "bread": [ { "id": 1, "bread_name":"test", "image": "breads/AJq3PHo6Ja4AkcuSsJgyvUoUi4XGOTsmplgqhgEp.png", "price": 10000, "gram": "250", "bread_type": "test" }, { "id": 2, "bread_name": "test", "image": "breads/AJq3PHo6Ja4AkcuSsJgyvUoUi4XGOTsmplgqhgEp.png", "price": 10000, "gram": "200", "bread_type": "test" } ], "province": { "id": 19, "name": "test" }, "city": { "id": 729, "province_id": 19, "name": "test" }, "neighbourhood": { "id": 2, "city_id": 729, "name": "test" } } } ]
补充:服务器请求代码
Future<Map<String, dynamic>?> getResponse( HTTP method, String endPoint, Map<String, dynamic>? parameters) async { try { const r = RetryOptions(maxAttempts: 3); final response = await r.retry( () => _submit(method, endPoint, parameters), retryIf: (e) => e is SocketException || e is TimeoutException, ); return {'statusCode': response.statusCode, 'data': response.data}; } on DioError catch (e) { throw (e.response != null ? e.response!.statusCode : e.error.osError.errorCode) as Object; } }
解决方案
1. 先明确success['data']的List类型
分析错误的根源是success['data']的类型为dynamic,Dart分析器无法确定它是可迭代的List。先将其转换为List<dynamic>,再进行map操作:
final dataList = success['data'] as List<dynamic>; final onlineBakers = dataList.map((data) => UserModel.fromJson(data as Map<String, dynamic>)).toList();
2. 直接包裹原始列表后映射
如果不想拆分变量,可直接将success['data']转为List后处理:
final onlineBakers = List<UserModel>.from( (success['data'] as List<dynamic>).map( (data) => UserModel.fromJson(data as Map<String, dynamic>), ), );
3. 添加空安全检查的严谨写法
考虑到success['data']可能为null,可增加空判断:
final onlineBakers = <UserModel>[]; final data = success['data']; if (data is List<dynamic>) { onlineBakers = data.map((item) => UserModel.fromJson(item as Map<String, dynamic>)).toList(); }
错误原因说明
map方法返回的是MappedListIterable,它并非List的子类,直接用as List<UserModel>强转会失败。必须调用toList()将迭代器转为真正的List,或用List.from()包裹迭代器。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

