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

标签 firebase flutter arraylist dart google-cloud-firestore

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

相关文章:

ios - 在 Firebase 实时数据库 swift 上 append 一个列表

Android:使用Firebase存储静态数据

ios - 如何使用 Xcode : open ios/Runner. xcworkspace 中的签名 ID 解决此错误 "Try replacing ' com.example'

Java GUI 将 JList 添加到另一个文件中的类

javascript - 使用 javaScript 按单词中元音的数量对句子进行排序并从左侧对其进行索引

java - Java 中查找整数 ArrayList 中最小值的递归函数

java - 为什么不在 Android 控制台上显示 firebase 事件?

java - 如何使用 Firebase 使用一个表中的数据作为引用来获取另一个表中的另一数据?

flutter - localStorage运行 "flutter run -d chrome"时如何设置Chrome的端口?

添加 Firebase 后 Flutter iOS 不再工作