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

Dart中实现列表元素对应生成Map并添加到List的异常问题

解决方法:将两个列表元素一一对应生成Map列表

问题根源

你的代码存在两个核心问题:

  • 嵌套循环导致值覆盖:内层循环会遍历所有nation元素,最终playerSingle['nation']只会保留最后一个值(Portugal),所有name对应的nation都被设置成了最后一个元素。
  • 复用同一Map引用:playerSingle是在循环外创建的单个对象,每次添加到playerList的都是这个对象的引用。后续修改playerSingle时,列表中所有已添加的元素都会同步变化,最终所有元素都是最后一次修改的结果。

修复方案

方案1:索引循环+每次创建新Map

直接通过索引一一对应两个列表的元素,并且在循环内创建新的Map对象,避免引用复用:

void main() {
  var name = ["Messi", "Ronaldo"];
  var nation = ["Argentina", "Portugal"];
  var playerList = [];

  for (int i = 0; i < name.length; i++) {
    // 每次循环创建新的Map,确保每个元素都是独立对象
    Map<dynamic, dynamic> playerSingle = {};
    playerSingle['name'] = name[i];
    playerSingle['nation'] = nation[i];
    playerList.add(playerSingle);
  }
  print(playerList);
}

方案2:使用List.generate简化代码

利用Dart的List.generate方法,更简洁地生成目标列表,本质也是为每个索引创建独立的Map:

void main() {
  var name = ["Messi", "Ronaldo"];
  var nation = ["Argentina", "Portugal"];
  
  var playerList = List.generate(name.length, (index) => {
    'name': name[index],
    'nation': nation[index]
  });
  
  print(playerList);
}

两种方案都能输出预期结果:
[{name: Messi, nation: Argentina}, {name: Ronaldo, nation: Portugal}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:45:24