Flutter空数组解析报错:List<dynamic>无法转为List<SubscriptionPackageDetails>?
Flutter解析空数组时类型转换错误解决
问题描述
解析接口数据时遇到类型转换错误:
type 'List<dynamic>' is not a subtype of type 'List<SubscriptionPackageDetails>?'
已定义SubscriptionPackageDetails类,接口返回应为List<SubscriptionPackageDetails>,但返回空数组时触发错误,有数据时解析正常。当前解析逻辑:
subscriptionDetails: List.unmodifiable( (data[ApiExchangeKeys.subscriptionDetails] as List<dynamic>).map( (package) => SubscriptionPackageDetails.fromJson( package as Map<String, dynamic>))),
解决方法
1. 显式指定map泛型类型
空数组时,map默认返回Iterable<dynamic>,Dart无法自动推断为目标类型,需显式声明泛型:
subscriptionDetails: List.unmodifiable( (data[ApiExchangeKeys.subscriptionDetails] as List<dynamic>) .map<SubscriptionPackageDetails>( (package) => SubscriptionPackageDetails.fromJson( package as Map<String, dynamic>, ), ), ),
2. 增加空值兜底处理
如果接口可能返回null而非空数组,需补充空判断:
subscriptionDetails: (data[ApiExchangeKeys.subscriptionDetails] as List<dynamic>?) ?.map<SubscriptionPackageDetails>( (package) => SubscriptionPackageDetails.fromJson( package as Map<String, dynamic>, ), ) .toList(growable: false),
用toList(growable: false)替代List.unmodifiable,效果一致且更适配空场景。
原因说明
当数组为空时,map操作后没有元素,Dart无法推断出Iterable的具体泛型类型,默认是dynamic,导致转换为List<SubscriptionPackageDetails>时出现类型不匹配。显式指定泛型后,就能明确Iterable的类型,避免转换错误。
内容的提问来源于stack exchange,提问作者Pallavi Tapkir
相关产品推荐
相关产品推荐

