将值添加到 LinkedHashMap 会导致所有键的值相同
Adding values to LinkedHashMap results in the same value for all keys
我正在使用 LinkedHashMap 将数组添加到不同的键,如下所示:
nextQ(String qid) {
print(answersList);
print(qid);
setState(() {
answers[qid] = answersList;
});
print(answers);
_swipeAnimation();
answersList.clear();
}
clicked(String quesid, String id) {
setState(() {
if (!answersList.contains(id)){
answersList.add(id);
}
qid = quesid;
});
}
第一次调用 nextQ 我得到:
answersList = [5c2c9b21108d3d04531494a7, 5c2c9b21108d3d04531494a6]
and the answers = {5c2c9b21108d3d04531494a4:
[5c2c9b21108d3d04531494a7, 5c2c9b21108d3d04531494a6]}
这是正确的。第二次调用我得到:
answersList = [5c2c9b21108d3d04531494a2] .. which is correct
答案是:
answers = {5c2c9b21108d3d04531494a4: [5c2c9b21108d3d04531494a2],
5c2c9b21108d3d04531494a1: [5c2c9b21108d3d04531494a2]}
这是错误的。
为什么地图中的所有键都设置了最后一个 answersList 值?
您每次在地图中设置条目时都使用相同的列表 (answersList),因此此列表成为您地图中所有值的后备列表。因此,您对 answersList 所做的每项更改都将复制到地图中的所有值。如果在 answersList.clear() 之后放置打印语句,您可以看到这一点;行,这将使用指向空列表的 ID 打印您的地图。
要解决此问题,您需要为将放入地图中的每个值创建 answersList 的副本:
answers[qid] = List.from(answersList);
我正在使用 LinkedHashMap 将数组添加到不同的键,如下所示:
nextQ(String qid) {
print(answersList);
print(qid);
setState(() {
answers[qid] = answersList;
});
print(answers);
_swipeAnimation();
answersList.clear();
}
clicked(String quesid, String id) {
setState(() {
if (!answersList.contains(id)){
answersList.add(id);
}
qid = quesid;
});
}
第一次调用 nextQ 我得到:
answersList = [5c2c9b21108d3d04531494a7, 5c2c9b21108d3d04531494a6]
and the answers = {5c2c9b21108d3d04531494a4: [5c2c9b21108d3d04531494a7, 5c2c9b21108d3d04531494a6]}
这是正确的。第二次调用我得到:
answersList = [5c2c9b21108d3d04531494a2] .. which is correct
答案是:
answers = {5c2c9b21108d3d04531494a4: [5c2c9b21108d3d04531494a2], 5c2c9b21108d3d04531494a1: [5c2c9b21108d3d04531494a2]}
这是错误的。 为什么地图中的所有键都设置了最后一个 answersList 值?
您每次在地图中设置条目时都使用相同的列表 (answersList),因此此列表成为您地图中所有值的后备列表。因此,您对 answersList 所做的每项更改都将复制到地图中的所有值。如果在 answersList.clear() 之后放置打印语句,您可以看到这一点;行,这将使用指向空列表的 ID 打印您的地图。
要解决此问题,您需要为将放入地图中的每个值创建 answersList 的副本:
answers[qid] = List.from(answersList);