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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:45:41