无法通过颤振应用程序中的用户 ID 获取特定的用户文档

Posted

技术标签:

【中文标题】无法通过颤振应用程序中的用户 ID 获取特定的用户文档【英文标题】:Not able to fetch particular user document by user id in flutter app 【发布时间】:2020-10-18 13:18:21 【问题描述】:

我想通过用户集合中的 id 检索特定用户文档。当我直接传递特定的用户 ID 时,我得到了数据。但是当我使用变量传递它时,它显示为 null。

我的代码如下:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import '../services/crud.dart';

class test extends StatefulWidget 
  @override
  _testState createState() => _testState();


class _testState extends State<test> 

  String userID="";
  @override
  void initState() 
    super.initState();
    ///get current user and assign his id
    FirebaseAuth.instance.currentUser().then((FirebaseUser user) 
      setState(() 
        userID = user.uid;
        print(userID);
      );
    );
  
  @override
  Widget build(BuildContext context) 
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          StreamBuilder(
                  stream: Firestore.instance.collection('users').document(userID).snapshots(),
                  builder: (context,snapshot)
                    if (!snapshot.hasData) return const Text("Loading...");
                    else return Container(
                      child: Column(
                        children: <Widget>[
                          Text(snapshot.data["name"]),
                          Text(snapshot.data["email"]),
                          Text(snapshot.data["phone"].toString()),
                        ],
                      ),
                    );
                  ,
                )
        ],
      )
    );
  


当我使用以下代码行并指定 uid 时,它会显示结果:

stream: Firestore.instance.collection('users').document('d6DshRomJMkIe9mAARAi').snapshots(),

但是当我在 document() 中传递 userID 时它不起作用。即使 userID 包含登录用户的实际 id。

stream: Firestore.instance.collection('users').document(userID).snapshots(),

错误说:

NoSuchMethodError: The method '[]' was called on null.
Receiver: null
Tried calling []("name")

This is the structure of my database.

This is the error that I get on my app screen.

【问题讨论】:

嘿彼得,我刚刚添加了数据库的截图。 做一个小测试。用一些 id 初始化 userID,像这样:String userID = 'd6DshRomJMkIe9mAARAi' 并检查它是否适用于 userID。 即使使用一些 id 初始化后问题仍然存在。 我要求进行这个小测试的原因与下面@Peter 的答案相同。在您获得用户 ID 之前执行的查询。但如果即使初始化它也不起作用,这很奇怪。 感谢您的回答 :) @JRamos29。我已经用 Peter'sanswer 更新了我的代码,即使它不工作,但当我提供默认 ID 时它开始工作。 【参考方案1】:

当使用userID 时不起作用,因为currentUser() 是异步的,并且在获取userId 之前就调用了StreamBuilder,因此请尝试以下操作:

   Stream<DocumentSnapshot> getData()async*
     FirebaseUser user = await FirebaseAuth.instance.currentUser();
     yield* Firestore.instance.collection('users').document(user.uid).snapshots();
  

创建一个返回 Stream 的方法,然后在 StreamBuilder 内执行以下操作:

children: <Widget>[
          StreamBuilder(
                  stream: getData(),
                  builder: (context,snapshot)
                    if (!snapshot.hasData) return const Text("Loading...");
                    else if(snapshot.hasData)
                    return Container(
                      child: Column(
                        children: <Widget>[
                          Text(snapshot.data["name"]),
                          Text(snapshot.data["email"]),
                          Text(snapshot.data["phone"].toString()),
                        ],
                      ),
                    );
                   ,
                return CircularProgressIndicator();
                  ,
                )
        ],
 

【讨论】:

在使用 getData() 函数时问题仍然存在。当我直接将 uid 作为“d6DshRomJMkIe9mAARAi”传递时,它开始显示结果。 方法里面可以打印(user.uid) 是的,它正在正确打印用户 ID。 在我的代码中编辑,添加return CircularProgressIndicator();并添加 else if(snapshot.hasData) 非常感谢,彼得·哈达德。实际上问题是uid与auth uid不匹配。我在我的注册代码中更正了。您提供的代码比我使用的要干净得多。再次感谢您:)

以上是关于无法通过颤振应用程序中的用户 ID 获取特定的用户文档的主要内容,如果未能解决你的问题,请参考以下文章

如何获取颤振的本地通知数据?

无法从快递应用程序中获取特定用户数据

在 PHP 中向特定用户推送通知

如何使用颤振和飞镖从 Cloud Firestore 检索特定数据?

如何通过 facebook graph api 获取***故事讲述者用户 ID

获取与用户 ID 匹配的用户帖子:Flutter