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

