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
相关产品推荐
相关产品推荐

