gpt4 book ai didi

firebase - List.contains()在Firestore文档列表上不起作用

转载 作者:行者123 更新时间:2023-12-03 03:23:13 26 4
gpt4 key购买 nike

我有一个包含几个文档快照的列表。当我执行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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com