You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:09:03