Firebase Firestore正在flifter中忽略查询中的where子句

Firebase Firestore正在flifter中忽略查询中的where子句,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,如何找到与登录电子邮件匹配的文档 当我尝试使用下面的代码时,Firestore忽略了where子句,只带出学生集合中的所有文档,不管它们是否匹配。 我读过在Firebase控制台中手动添加索引的文章,但我尝试了()但没有成功。代码中是否有错误,或者我没有正确索引它 更新:代码输出:第一次打印是电子邮件,但之后应该只有一次打印是“peV2zNJukJTWKxanR9Cx”- 以及firestore图像中的数据结构: 如果我将'email'变量替换为'henycave@gmail.com在where

如何找到与登录电子邮件匹配的文档

当我尝试使用下面的代码时,Firestore忽略了
where
子句,只带出学生集合中的所有文档,不管它们是否匹配。 我读过在Firebase控制台中手动添加索引的文章,但我尝试了()但没有成功。代码中是否有错误,或者我没有正确索引它

更新:代码输出:第一次打印是电子邮件,但之后应该只有一次打印是“peV2zNJukJTWKxanR9Cx”- 以及firestore图像中的数据结构:

如果我将'email'变量替换为'henycave@gmail.com在where子句中,它起作用

 @override
  void initState() {
    super.initState();
    getUserEmail();
    getData();
  }


    getUserEmail() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedInUser = user;
        email = loggedInUser.email;
        print(email);
      }
    } catch (e) {
      print(e);
    }
  }

  getData() async {
    var documents = await _firestore
        .collection('students')
        .where('email', isEqualTo: email)
        .getDocuments();

    for (var document in documents.documents) {
      print(document.data['grade']);
    }
  }
还有我的pubspec.yaml:

    name: school
    description: A new Flutter application.
    
    
    version: 1.0.0+1
    
    environment:
      sdk: ">=2.1.0 <3.0.0"
    
    dependencies:
      flutter:
        sdk: flutter
    
    
      cupertino_icons: ^0.1.2
      firebase_core: ^0.4.5
      firebase_auth: ^0.16.1
      cloud_firestore: ^0.13.7
    
    
    dev_dependencies:
      flutter_test:
        sdk: flutter
     
    flutter:
      uses-material-design: true
      assets:
        - images/

名称:学校
描述:一个新的颤振应用。
版本:1.0.0+1
环境:

sdk:“>=2.1.0Firestore仅在传递给compare的参数为null或空时才忽略where子句

您确定在
getData()
之前调用了
getUserEmail()
,并且email变量实际被赋值了吗

请尝试更正这些,您的问题应该会得到解决


此外,除非比较
where
子句中的两个或多个字段,否则不需要索引。

Firestore仅在传递给compare的参数为null或空时才会忽略where子句

您确定在
getData()
之前调用了
getUserEmail()
,并且email变量实际被赋值了吗

请尝试更正这些,您的问题应该会得到解决


另外,除非比较
where
子句中的两个或多个字段,否则不需要索引。

我最终找到了答案,因为我在initState()中调用了这两个方法,并且这个函数不接受async和Wait关键字,getData()函数在getUserEmail()之前开始执行在email变量上完成电子邮件的保存。因此where子句获得的是未来而不是值。因此,我将两个函数合并为一个函数,以便它们可以正确地等待另一个函数完成。在initState()中调用该函数。

我终于找到了答案,因为我在initState()中调用了这两个方法并且该函数不接受异步和等待关键字getData()函数在getUserEmail()之前开始执行在email变量上完成电子邮件的保存。因此where子句获取的是未来而不是值。因此,我将两个函数合并为一个函数,以便它们可以正确等待另一个函数完成。并在initState()中调用该函数

我从未见过Firestore忽略查询子句,因此怀疑还有其他问题。您是否可以将问题编辑为:1)打印
电子邮件的值,然后包括更新的代码及其输出,2)包括查询返回的不应该是的文档的屏幕截图,3)打印文档ID和电子邮件,并包括更新后的代码及其输出。这些内容加在一起将是一个问题,因此我也建议研究该链接。@FrankvanPuffelen我已经编辑了这个问题,我希望现在可以理解,我期待您对问题的建议1)如果您添加
print(email)
(或类似内容)作为
getData
中的第一行,它会打印什么?2)如果
打印(documents.size)
在查询之后,它会打印什么?我从未见过Firestore忽略查询子句,因此怀疑还有其他问题。您可以将您的问题编辑为:1)打印
电子邮件的值,然后包括更新的代码及其输出,2)包括您的查询返回的文档的屏幕截图ldn't be,3)打印文档ID和电子邮件,并包括更新的代码及其输出。这些内容一起将是一个,因此我也建议研究该链接。@FrankvanPuffelen我已经编辑了这个问题,我希望现在可以理解,我期待您对问题的建议1)如果您添加
打印(电子邮件)
(或类似的内容)作为
getData
中的第一行,它会打印什么?2)如果您
print(documents.size)
在查询之后,它会打印什么?我已经编辑了这个问题,现在您可以看到我在getData()之前调用了getUserEmail()email变量不是null,因为print语句打印email我已经编辑了这个问题,现在您可以看到我在getData()之前调用了getUserEmail()email变量不为null,因为print语句打印email非常感谢,你为我节省了很多时间,保重:)非常感谢,你为我节省了很多时间,保重:)