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