我正在通过使用两个名为mailListfilteredMailList的列表来创建一个过滤系统。第一次填充mailList时,此代码运行:

setState(() {
  filteredMailList.clear();
  filteredMailList = mailList;
});

完成此操作后,即使我没有再次执行这两行,似乎我对mailList所做的任何更改都已复制到filteredMailList。例如:
//Assume that mailList = ["1", "2", "3"] and filteredMailList = []
filteredMailList = mailList
//I expect then mailList = ["1", "2", "3"] and filteredMailList = ["1", "2", "3"]
mailList.add("4")
//I expect then mailList = ["1", "2", "3", "4"] and filteredMailList = ["1", "2", "3"]
//However when this is run mailList = ["1", "2", "3", "4"] and filteredMailList = ["1", "2", "3", "4"]

这是否与我可能没有给两个列表相同的内容,而是说它们在引用相同的列表有关?

有没有一种方法可以使filteredMailList仅包含mailList的元素,而实际上不引用完全相同的列表,因此仍然可以单独编辑每个列表?

最佳答案

在代码中,通过调用filteredMailList = mailList;,实际上是在删除原始的filteredMailList列表(您对该列表不再有任何偏好)并将其更改为mailList。因此,filteredMailList和mailList都指向内存中的单个List

您可以从mailList创建一个克隆列表,例如:

filteredMailList = [...mailList]; // or filteredMailList = mailList.toList();

或保留原始引用并复制mailList中的所有项目

filteredMailList.clear();
filteredMailList.addAll(mailList);

08-24 19:57