如何不重复列表飞镖中的相同项目?

时间:2019-10-25 08:12:38

标签: arrays list button flutter dart

我创建了一个listView和按钮,当我单击该按钮时,它将一个项目添加到listView。

问题是我实际上不想重复列表中的相同项目。

我尝试了.contains方法,但是没有用。

我想要一个好的解决方案,

4 个答案:

答案 0 :(得分:0)

在添加列表之前,检查列表是否已包含该元素: https://api.flutter.dev/flutter/dart-core/List-class.html

if(!List.contains(element) { add }

contains方法检查是否相等,而不是参考,因此,只要您比较相似的元素,它就必须起作用。如果您的代码不起作用,请提供给我们。谢谢。

答案 1 :(得分:0)

如果您的列表包含自定义对象,则可能需要覆盖自定义类中的equality operator

您也可以使用Set代替列表。

答案 2 :(得分:0)

使用清单代替清单。

void main() {
  Set<String> currencies = {'EUR', 'USD', 'JPY'};
  currencies.add('EUR');
  currencies.add('USD');
  currencies.add('INR');
  print(currencies);
}

输出:{EUR, USD, JPY, INR} // unique items only

参考:Set<E> class

答案 3 :(得分:0)

有多种方法可以实现这一目标:

1)遍历列表,并检查每个元素是否没有    您认为相等的属性:

items = [Item(id: 1), Item(id: 2)];
newItem = Item(id: 2);
if (items.every((item) => item.id != newItem.id)) {
  items.add(newItem);
}

2)使用contains()并覆盖== operator(也覆盖hashCode)    在对象类中具有您认为相等的属性。

items = [Item(id: 1), Item(id: 2)];
newItem = Item(id: 2);
if (!items.contains(newItem)) {
  items.add(newItem);
}

// inside Item class
@override
bool operator ==(other) {
  return this.id == other.id;
}

@override
int get hashCode => id.hashCode;

3)代替List,而使用Set,其中每个元素只能出现一次。它的默认实现是LinkedHashSet,它可以跟踪订单。