list - 从列表中删除用户定义的项目
问题描述
嗨,我想从我的List
过程中删除数据,onTap
但我无法这样做。
这是代码:
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
。
解决方案
@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
推荐阅读
- docker - 可以运行 Ansible playbook 的 Docker Hub 映像
- python - 说出对非管理员禁用 @everyone 的命令
- objective-c - Objective-c 将参数传递给安装后脚本
- encryption - 什么是 Zip 强加密规范/SecureZip 密钥派生功能?
- c++ - 从字符串中读取数组元素
- google-colaboratory - colab pro + ram 是否有可能不增加
- typescript - 如何在打字稿类型中使一个属性不可选?
- r - 网页抓取返回 R 中的合并句子
- c++ - 在容器上迭代地应用 range-v3 views::filter
- flutter - Flutter 的“NeumorphicToggle”不起作用