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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:10:31