如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?

Posted

技术标签:

【中文标题】如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?【英文标题】:How to Retrieve data from firebase firestore using the UserID in flutter? 【发布时间】:2022-01-24 03:08:05 【问题描述】:

我想在每次用户登录时从 firebase firestore 中检索 userName。所以我不想使用来自 firebase 的用户 ID 检索用户数据并显示它。

我在下面附上了我当前的代码。

如何调整以下代码以使用 user_ID 作为主键从 firestore 获取 userName

当前代码:

类 GetUserName 扩展 StatelessWidget

  final String documentId;

  GetUserName(this.documentId);

  @override
  Widget build(BuildContext context) 
    CollectionReference users = FirebaseFirestore.instance.collection('users');

    return FutureBuilder<DocumentSnapshot>(
      future: users.doc(documentId).get(),
      builder:
          (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) 
        if (snapshot.hasError) 
          return Text("Something went wrong");
        

        if (snapshot.hasData && !snapshot.data!.exists) 
          return Text("Document does not exist");
        

        if (snapshot.connectionState == ConnectionState.done) 
          Map<String, dynamic> data =
              snapshot.data!.data() as Map<String, dynamic>;
          return Text("Hello, $data['userName']");
        

        return Text("loading");
      ,
    );
  

提前谢谢你:)

【问题讨论】:

您是否使用 Firebase 身份验证? 是的,我正在使用 firebase 身份验证,并且在 firebase 身份验证中可以使用 User UID。我也有那个 firrbase auth UserId 作为我在云 Firestore 中的Document Id 【参考方案1】:

你会想在 `` 上使用StreamBuilder 来处理当前用户,如下所示:

return StreamBuilder(
  stream: FirebaseAuth.instance.authStateChanges(),
  builder: (context, snapshot) 
    if (snapshot.connectionState != ConnectionState.active) 
      return Center(child: CircularProgressIndicator()); // ? user is loading
    
    final user = snapshot.data;
    final uid = user.uid; // ? get the UID
    if (user != null) 
      print(user);

      CollectionReference users = FirebaseFirestore.instance.collection('users');

      return FutureBuilder<DocumentSnapshot>(
        future: users.doc(uid).get(),
        builder:
            (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) 
          if (snapshot.hasError) 
            return Text("Something went wrong");
          

          if (snapshot.hasData && !snapshot.data!.exists) 
            return Text("Document does not exist");
          

          if (snapshot.connectionState == ConnectionState.done) 
            Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>;
            return Text("Hello, $data['userName']");
          

          return Text("loading");
        ,
      );
     else 
      return Text("user is not logged in");
    
  ,

在做这样的事情时,我总是把 FlutterFire 文档放在手边

【讨论】:

嗨,我是 Flutter 的新手。所以这对我来说有点困惑,如果可能的话,你能告诉我如何通过firebase auth User UID获取当前用户的用户名吗?我有firebase auth User UID 作为我的firestore document ID 那是user.uid,我也刚刚添加了我的答案。文档:firebase.flutter.dev/docs/auth/usage 成功了!非常感谢:)

以上是关于如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中从 Firebase Auth 获取用户 ID?

如何从 loginName 控件中获取 UserName 或 UserId?

如何使用 Dart / Flutter 中的列表从列表中删除重复元素?

如何使用 Flutter 从 Firestore 中的 ListView 获得无限滚动

如何使用 Flutter 从 Firebase 中的两个集合中获取数据

如何使用从 Flutter 中的 json 解析的嵌套映射列表中的函数创建对象