我有一个包含几个文档快照的列表。当我执行list.contains(documentsnapshot)时,它总是返回false。例:
DocumentSnapshot a = document;
List<DocumentSnapshot> snapshots = []
snapshots.add(a);
snapshots.contains(a) // false
精简了实际代码
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class AddUsersDialog extends StatefulWidget {
@override
_AddUsersDialogState createState() => _AddUsersDialogState();
}
class _AddUsersDialogState extends State<AddUsersDialog> {
List<DocumentSnapshot> selected = [];
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
child: Column(
children: <Widget>[
// row to display the selected users
Row(
children: List.generate(selected.length,
(index) => InkWell(
onTap: () => setState(() => selected.removeAt(index)),
child: Text(selected[index]['name']),
);
),
),
// list of all users
StreamBuilder<QuerySnapshot>(
stream: getUsers(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
List<DocumentSnapshot> users = snapshot.data.documents;
return Flexible(
child: ListView.builder(
itemCount: users.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
leading: Text(users[index]['name']),
onTap: () => setState(() {
if (selected.contains(users[index])) return;
selected.add(users[index]);
}),
);
},
),
);
}
}
),
],
),
),
);
}
}
我得到了streambuilder数据,它显示得很好,可以将documentSnapshots添加到所选列表中,然后可以再次将其删除。仅当我检查用户列表中的用户是否已位于所选列表中时,即使当我打印该列表以及该用户时,我仍会看到它已经存在,它始终将返回false。
解决方案
显然,直接比较DocumentSnapshots将产生Morez答案注释中所述的问题。我通过创建自定义包含功能解决了它
bool contains(List<DocumentSnapshot> list, DocumentSnapshot item) {
for (DocumentSnapshot i in list) {
if (i.documentID == item.documentID) return true;
}
return false;
}
最佳答案
我只是运行了类似的代码,但是它按预期运行。确保您的文档不为空,因为这可能是问题所在。但是,如果您成功添加文档,则将获得snapshots.contains(a)为true。
更新了答案
我认为问题在于您正在比较对象。第二次运行if语句时,您将两个具有相同详细信息的不同对象进行比较,因为每次运行构建器时,您都会在内存中创建一个新对象。这样就比较了2个不同的内存位置,结果始终为false,因此您始终将对象添加到列表中。您可以使用identical(this,other)或查看其哈希码以了解它们是不同的对象。
解决方案是检查对象的独特之处并进行比较。您可以检查其ID或名称,如果它们不同,则用户也不同,然后将其添加到列表中。
您也可以看看this。
关于firebase - List.contains()在Firestore文档列表上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60836455/