Flutter开发中点击ListTile无法删除自定义类列表指定元素求助
核心原因
Dart 中自定义类默认按照引用相等判断两个实例是否相同:即使两个ListClass实例的Bname、Blat、Blng属性完全一致,只要是两次new生成的不同对象,==运算符就会返回false。这就导致你代码中的contains匹配、removeWhere中的对象对比逻辑全部失效,无法正确识别到列表中已存在的目标对象。
解决方案1:重写ListClass的相等判断逻辑
修改ListClass定义,重写==运算符和对应的hashCode,让Dart按照属性值判断实例是否相等,修改后的类代码如下:
class ListClass{ String Bname; String Blat; String Blng; ListClass(this.Bname, this.Blat, this.Blng); @override String toString(){ return '{${this.Bname}, ${this.Blat}, ${this.Blng}}'; } // 重写相等判断逻辑,按属性匹配 @override bool operator ==(Object other) => identical(this, other) || other is ListClass && runtimeType == other.runtimeType && Bname == other.Bname && Blat == other.Blat && Blng == other.Blng; // 同步重写hashCode,和相等判断逻辑对齐 @override int get hashCode => Bname.hashCode ^ Blat.hashCode ^ Blng.hashCode; }
修改后你原有代码的contains、removeWhere逻辑无需调整即可正常运行。
解决方案2:调整删除和匹配逻辑,直接对比属性
如果不想修改类定义,也可以直接调整业务代码的判断逻辑,不再对比实例对象,直接匹配属性值即可,onTap部分修改如下:
onTap: (){ // 提前提取要匹配的属性值,避免重复取值 final targetName = user.data['BusstopName']; final targetLat = user.data['location'].latitude.toString(); final targetLng = user.data['location'].longitude.toString(); // 用any判断是否存在,直接匹配属性 if(_selectedBusStop.any((val) => val.Bname == targetName && val.Blat == targetLat && val.Blng == targetLng)){ setState(() { // 删除时也直接匹配属性 _selectedBusStop.removeWhere((val) => val.Bname == targetName && val.Blat == targetLat && val.Blng == targetLng); print(_selectedBusStop); }); } },
这个方案还可以避免每次判断都重复创建ListClass实例,性能更优。
内容的提问来源于stack exchange,提问作者randomstudent
相关产品推荐
相关产品推荐

