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

Flutter遍历嵌套Map与List报错:可空表达式不可作for-in迭代器

问题描述

遍历嵌套List的Map列表结构时抛出如下错误:

A nullable expression can't be used as an iterator in a for-in loop.(可空表达式无法作为for-in循环的迭代器使用)

问题复现代码:

void main() {
  final changes = [
    {
      'version': '1',
      'date': '3 Nov 2021',
      'content': [
        'Changes 1',
        'Changes 2',
      ],
    },
    {
      'version': '2',
      'date': '5 Nov 2021',
      'content': [
        'Changes 3',
        'Changes 4',
        ],
    },
  ];
  
  for (var el in changes) {
    for (var subEl in el['content']) {
      print (subEl);
    }
  }
}
报错原因

Dart类型系统中,通过Map的键下标取值(即el['content'])时,返回值是可空类型:编译器无法100%确认该键一定存在、对应值一定是非空的可迭代对象。而for-in循环要求传入的迭代器必须是非空值,因此直接传入可空表达式会触发编译错误。

修复方法

根据业务场景选以下任意一种方案即可:

  • 强转类型(仅适用于能100%确认所有Map元素都存在content键、且对应值为非空列表的场景):将el['content']强转为List类型,明确告知编译器该值非空、类型合法。
  • 空值兜底(通用场景推荐):给取值结果加空合并运算符,如果content取到null,就返回空列表作为迭代对象,不会触发空相关错误。
  • 前置类型校验(生产环境严谨场景用):先判断取值结果是否为非空List,校验通过再进入循环,同时规避空值、类型不匹配两类问题。
修复后可运行代码

(以通用的空值兜底方案为例)

void main() {
  final changes = [
    {
      'version': '1',
      'date': '3 Nov 2021',
      'content': [
        'Changes 1',
        'Changes 2',
      ],
    },
    {
      'version': '2',
      'date': '5 Nov 2021',
      'content': [
        'Changes 3',
        'Changes 4',
      ],
    },
  ];
  
  for (var el in changes) {
    // 取值为空时用空列表兜底,避免迭代空值报错
    for (var subEl in el['content'] ?? []) {
      print(subEl);
    }
  }
}

如果用强转方案,内层循环写法为:

for (var subEl in el['content'] as List) {
  print(subEl);
}

内容的提问来源于stack exchange,提问作者Sen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:03:26