从列表中删除用户定义的项目

Posted

技术标签:

【中文标题】从列表中删除用户定义的项目【英文标题】:Remove User Defined Item from List 【发布时间】:2021-10-21 10:00:54 【问题描述】:

您好,我想在onTap 期间从我的List 中删除数据,但我无法这样做。

这是代码:

  Widget buildUser(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
    return ListView.builder(
      itemCount: snapshot.data.documents.length,
      itemBuilder: (context, index)
        DocumentSnapshot user = snapshot.data.documents[index];
        final style = _selectedBusStop.contains(ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()))
        ? TextStyle(
          fontSize: 18,
          color: Colors.blueAccent,
          fontWeight: FontWeight.bold,
        ): TextStyle(fontSize: 18);
        return ListTile(
          leading: CircleAvatar(
            backgroundImage: NetworkImage(
                user.data['image']
            ),
          ),
          title: Text(user.data['BusstopName'], style: style),
          subtitle: Text('Operating Hour: ' + user.data['OperatingHour'], style: style),
          trailing:
          _selectedBusStop.contains((ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()))) ? Icon(Icons.check, color: Colors.blueAccent, size: 26) : null,
          onTap: ()
            if(_selectedBusStop.contains(ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString())))
              setState(() 
                _selectedBusStop.removeWhere((val) => val == ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()));
                print (_selectedBusStop);
              );
            
          ,
          onLongPress: ()
              setState(() 
                _selectedBusStop.add(ListClass(user.data['BusstopName'], user.data['location'].latitude.toString(), user.data['location'].longitude.toString()));
                print(_selectedBusStop);
              );
          
        );
      ,
    );
  

这是Class

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';
  

知道哪里出错了吗?提前谢谢你。

更新 List _selectedBusStop = [];

_selectedBusStop 为空 List 并且在 LongPress 时,它将向 List 添加数据,在 onPress 时,如果数据已经存在于 List 中,它将删除数据。

【问题讨论】:

什么是 _selectedBusStop 以及它的初始化位置,我可以在 itemCount 和 builder 中看到您正在使用 snapshot.data.documents 但您正在从 _selectedBusStop 中删除它,请分享什么是 _selectedBusStop 更新了我的问题。谢谢。 【参考方案1】:

@randomstudent 问题是实例,当你比较两个不同实例的值但即使值相同时,它也会返回 false,

例如简单理解。

void main() 
  final a = IntTestWrapper(3);
  final b = IntTestWrapper(3);
  print(a==b);


class IntTestWrapper 
  IntTestWrapper(this.a);
  final int a;

输出:假

如果要比较,请使用 equatable 进行比较

如果你这样改变

class IntTestWrapper extends Equatable 
  IntTestWrapper(this.a);
  final int a;

  @override
  List<Object> get props => [a];

那么对于这个

void main() 
  final a = IntTestWrapper(3);
  final b = IntTestWrapper(3);
  print(a==b);

输出为真。

要打印,您可以覆盖 toString

void main() 
  final a = IntTestWrapper(3);
  final b = IntTestWrapper(3);
  print(a);


class IntTestWrapper extends Equatable 
  IntTestWrapper(this.a);
  final int a;

  @override
  List<Object> get props => [a];

  @override
  String toString() => 'The value of a is :$a';

输出:The value of a is :3

【讨论】:

@randomstudent 在 onTap 的代码中,在您的“IF”条件下,您正在创建 ListClass 的新实例,这是错误的,只需使用 Equatable 扩展 ListClass,应该可以解决您的问题。 如果有帮助,请将其标记为答案,谢谢。 很高兴它对您有帮助,谢谢,很高兴为您提供帮助。 您可以覆盖 toString 来做到这一点,让我更新我的答案。 让我们continue this discussion in chat。

以上是关于从列表中删除用户定义的项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 从数组列表中添加和删除数组项

当用户单击按钮时从数组中删除对象

从过滤器列表和原始列表中删除项目

如何使用 REST API 从子集中删除项目

从数组javascript中删除项目时重新呈现列表的问题

Dart // Flutter:如何根据条目的内容从列表中删除项目