如何恢复 Firestore 中的特定数据?

How to recover a specific data in the firestore?

我在数据库中有这个结构:

我有一个return当前用户登录的功能

 FirebaseAuth auth = FirebaseAuth.instance;
 auth.currentUser.uid;

我想在“idUser”== auth.currentUser.uid;

时检索“requisicoes”

基本上,用户检索自己创建的请求。

那是我的 StreamBuilder

final _controller = StreamController<QuerySnapshot>.broadcast();
FirebaseFirestore db = FirebaseFirestore.instance;

StreamBuilder<QuerySnapshot> addListenersRequests() {
final stream = db
    .collection("requisicoes")
    .where("usuario.idUser", isEqualTo: idUsuarioLogado)
    .snapshots();


stream.listen((dados) {
  _controller.add(dados);
});
return null;

}

注意:idUsuarioLogado 是 return 正确的 currentUser

问题是我正在获取“requisicoes”集合中的所有内容,当我创建一个新用户时,其他用户的请求出现在屏幕上

StreamBuilder是不是逻辑有问题?

根据你的问题,我认为你正在获取当前登录的 uid 的数据。但是你想检索 particulers users[= 的详细信息29=] created(i,e documendId) 。然后你必须获取 documentId first.Like

body: StreamBuilder(
          stream:users.snapshots(),
          builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {

            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }

            if(!snapshot.hasData){
              return Center(
                child: CircularProgressIndicator(),
              );
            }

            return ListView(
                children: snapshot.data.documents.map((document) {
              return  Center(
                child: Container(
                  width:  MediaQuery.of(context).size.width/2.5,
                  height: MediaQuery.of(context).size.height/5,
                  child:  Text(document.id),

                ),
              );
            }).toList());
          }),

您必须获取 document.id。这是您的特定用户而不是这个。

FirebaseAuth auth = FirebaseAuth.instance;
 auth.currentUser.uid;

注意:这将 return 您当前登录的 userId.

有关详细信息,请阅读此link

我在这里找到了答案Firestore is ignoring the where clause in the query in flutter

我的例子和上面的link一样,我有两个函数,一个addListenersRequests()和另一个getCurrentUser(),这两个函数我是在initState方法中调用的,问题是 getCurrentUser 是异步的,所以在填充变量 idUsuarioLogado 的值之前先执行 addListenersRequests ()。

所以我把这两个函数合并为一个,这样getCurrentUser可以先执行

最终代码:

Future<StreamBuilder<QuerySnapshot>> addListenersRequests() async{

await getDataUser();

final stream = db
    .collection("requisicoes")
    .where("usuario.idUser", isEqualTo: idUsuarioLogado)
    .snapshots();

stream.listen((dados) {
  _controller.add(dados);
});
return null;

}

现在可以正常工作了。

这个故事的奇怪之处在于 firebase 执行子句并检索集合中的所有内容,即使引用的变量为 null