检查列表是否包含dart对象的属性

时间:2019-04-19 06:48:07

标签: dart

我需要检查myItemsList是否包含myitem.itemId,如果存在需要添加itemQuantity,如果不存在则需要向{{ 1}}。

myitem

myItemsList

List<MyItem> myItemsList = new List();

MyItem myitem = new MyItem (
  itemId: id,
  itemName: name,
  itemQuantity: qty,
);

if (myItemsList.contains(myitem.itemId)) {
  print('Allready exists!');
} else {
  print('Added!');
  setState(() {
    myItemsList.add(myitem);
  });
}

以上代码无法正常工作,请帮助我找出问题所在。

3 个答案:

答案 0 :(得分:8)

Contains()比较整个对象。

除了覆盖==运算符或遍历之外,您还可以使用列表的singleWhere方法:

  if ((myItemsList.singleWhere((it) => it.itemId == myitem.itemId,
          orElse: () => null)) != null) {

编辑: 正如Dharaneshvar所经历的和YoApps在评论中提到的那样。当发现更多元素时,.singleWhere引发StateError。

当您期望唯一的元素时(例如在比较ID的情况下),这是需要的。

引发错误是这里的朋友,因为它表明数据有问题。

对于其他情况,.firstWhere()是正确的工具:

  if ((myItemsList.firstWhere((it) => it.itemName == myitem.itemName,
          orElse: () => null)) != null) {

// EO编辑

整个示例:

List<MyItem> myItemsList = new List();
​
class MyItem {
  final String itemId;
  final String itemName;
  int itemQuantity;
​
  MyItem({
    this.itemId,
    this.itemName,
    this.itemQuantity,
  });
}
​
void main() {
  MyItem myitem = new MyItem(
    itemId: "id00",
    itemName: "name",
    itemQuantity: 50,
  );
​
  myItemsList.add(myitem);
​
  String idToCheck = "id00";
​
  if ((myItemsList.singleWhere((it) => it.itemId == idToCheck,
          orElse: () => null)) != null) {
    
    print('Already exists!');
  } else {
    print('Added!');
  }
}

答案 1 :(得分:2)

您使用的包含略有错误。

发件人:https://api.dartlang.org/stable/2.2.0/dart-core/Iterable/contains.html

bool contains(Object element) {
  for (E e in this) {
    if (e == element) return true;
  }
  return false;
}

您可以覆盖==运算符,请参见:https://dart-lang.github.io/linter/lints/hash_and_equals.html

@override    
bool operator ==(Object other) => other is Better && other.value == value;

或者您也可以遍历列表并按常规方式逐一搜索,这似乎稍微容易一些。

答案 2 :(得分:0)

如前所述,包含使用 == 运算符比较两个对象。因此,您目前将 MyItemString itemId 进行比较,它们永远不会相同。

要检查 myItemsList 是否包含 myitem.itemId,您可以使用以下方法之一:

myItemsList.map((item) => item.itemId).contains(myitem.itemId);

myItemsList.any((item) => item.itemId == myitem.itemId);