Dart:列表删除未删除对象

yruzcnhs  于 2023-01-15  发布在  其他
关注(0)|答案(6)|浏览(155)

如果您需要完整的示例,代码位于DartPad上(请参见while循环的结尾部分)。
我有一个循环,

Place place = places[0];
while (places.isNotEmpty) {
  // Get a list of places within distance (we can travel to)
  List reachables = place.getReachables();

  // Get the closest reachable place
  Place closest = place.getClosest(reachables);

  // Remove the current place (ultimately should terminate the loop)
  places.remove(place);

  // Iterate
  place = closest;
}

但是它没有删除倒数第二行的place,也就是说,places列表的长度保持不变,使它成为一个无限循环。

kzmpq1sx

kzmpq1sx1#

这可能是因为列表中的对象与您试图删除的对象具有不同的hashCode。
请尝试使用以下代码,通过比较对象属性找到正确的对象,然后再删除它:

var item = list.firstWhere((x) => x.property1== myObj.property1 && x.property2== myObj.property2, orElse: () => null);

list.remove(item);

另一种选择是覆盖类中的==运算符和hashCode。

class Class1 {
  @override
  bool operator==(other) {
    if(other is! Class1) {
      return false;
    }
    return property1 == (other as Class1).property1;
  }

  int _hashCode;
  @override
  int get hashCode {
    if(_hashCode == null) {
      _hashCode = property1.hashCode
    }
    return _hashCode;
  }
}
rqcrx0a6

rqcrx0a62#

我也遇到过同样的问题。不幸的是,我还没有找到根本原因,但在同样的情况下,我更换了
places.remove[place]

places.removeWhere(p => p.hachCode == place.hashCode)
作为一种变通方法。还有一种方法也很有帮助:

// Get the place from your set:
final place = places.first;
// Replace the place in the set:
places.add(place);
// Remove the place from the set:
places.remove(place);
qni6mghb

qni6mghb3#

很可能由于某种原因place不在列表中。如果不知道所使用的确切数据,很难进行调试,链接的DartPad中的三位示例不会重现该问题。
尝试找出导致问题的元素。例如,您可以尝试在删除之前添加一个if (!places.contains(place)) print("!!! $place not in $places");,或类似的东西,以检测问题发生时的状态。

8e2ybdfx

8e2ybdfx4#

这样,您就可以从动态列表中删除对象

List data = [
    {
      "name":"stack"
    },
    {
      "name":"overflow"
    }
  ];
  
  data.removeWhere((item) => item["name"]=="stack");
  
  print(data);

产出

[{name: overflow}]
1sbrub3j

1sbrub3j5#

使用插件Equatable
类Place扩展为Equatable {...}
https://pub.dev/packages/equatable

u2nhd7ah

u2nhd7ah6#

我也遇到了同样的问题。我用removeWhere做了这样的事情。

myList.removeWhere((item) => item.id == yourItemId.id)

相关问题