Dart解构模式中如何在条件内转换API数据类型?
Dart模式匹配中List转List<Map<String, dynamic>>的解决方案
问题原因
你遇到的TypeError是因为Dart模式匹配仅检查顶层类型(比如List),不会自动递归验证泛型参数类型。List<dynamic>和List<Map<String, dynamic>>属于不同类型,直接在模式中声明List<Map<String, dynamic>> types会匹配失败。
解决方案
方案1:安全验证+类型转换(推荐用于数据不可靠场景)
通过when守卫验证列表内所有元素的类型,再执行安全转换:
if (data case { "types": List types, "clientId": String clientId } when types.every((element) => element is Map<String, dynamic>)) { final List<Map<String, dynamic>> typedTypes = types.cast(); debugPrint('types:$typedTypes, clientId: $clientId'); } else { debugPrint('Error'); }
- 优势:不会抛出异常,当API返回数据不符合预期时自动进入错误分支
- 原理:
every方法确保所有元素都是Map<String, dynamic>,cast()将List<dynamic>转换为目标类型
方案2:直接类型断言(适合数据可靠场景)
若能确定API返回的types严格符合List<Map<String, dynamic>>格式,可直接在模式中使用as断言:
if (data case { "types": List types as List<Map<String, dynamic>>, "clientId": String clientId }) { debugPrint('types:$types, clientId: $clientId'); } else { debugPrint('Error'); }
- 优势:代码更简洁
- 注意:如果数据不符合类型要求,会抛出
CastError,需确保数据可靠性
补充说明
Dart泛型的协变特性允许List<Map<String, dynamic>>赋值给List<dynamic>,但反向转换必须显式处理——因为List<dynamic>可能包含非Map<String, dynamic>的元素,需要开发者手动验证或断言。
内容的提问来源于stack exchange,提问作者Jaafar Melhem
相关产品推荐
相关产品推荐

