dart 如何从flutter中user.uid等于documentid云firestore中获取数据?

l0oc07j2  于 2023-01-18  发布在  Flutter
关注(0)|答案(3)|浏览(118)

我有这个显示用户信息的配置文件屏幕。用户认证后,我在云firestore中存储数据,文档ID等于用户ID。现在,我想从云firestore中检索数据,当前用户ID等于文档ID。

现在我有这个:

class UserManagement {
  getData() async{
    String userId = (await FirebaseAuth.instance.currentUser()).uid;
    print(userId);
    return Firestore.instance.collection('users').document(userId);

  }

但当我注销时,这不能正常工作,用不同的用户重新登录后,它显示相同的数据。

UserManagement().getData().then((results) {
    setState(() {
      userFlag = true;
       users = results;
    });
    });

现在,如何得到其他字段,如姓名,电子邮件,课程,电话号码等,所有的值都存储到用户。对吗?

1bqhqjot

1bqhqjot1#

如果firestore中的文档id等于Firebase身份验证控制台中的userid,则需要首先检索uid,并将其作为参数传递给方法document()

getData() async{
    String userId = (await FirebaseAuth.instance.currentUser()).uid;
    return Firestore.instance.collection('users').document(userId);
  }
pinkon5k

pinkon5k2#

您的查询将获取“userData”集合中的所有文档,然后从整个集合中挑选出第一个文档。对于对该集合具有读访问权限的所有用户来说,这将是同一个文档集。我不明白您为什么会对不同的用户期望不同的结果。也许您的意思是为给定用户ID的用户访问单个文档,而不是所有文档。如果是这种情况,您应该通过文档的ID请求该文档,其中Firestore.instance.collection('userData').document(uid)' where uid '是当前登录用户的ID。
此外,您的代码正在查询一个名为“userData”的集合,但您的屏幕截图显示的是一个名为“users”的集合,因此这很令人困惑。

7kqas0il

7kqas0il3#

有两种方式:

1.流生成器

当您希望不断听取更改,并希望数据在不进行热重新加载/重新启动的情况下得到更新时

2.未来构建者

当您只想获取文档一次,并且不需要不断地监听文档的更改时。

流生成器

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
          stream:  FirebaseFirestore
                   .instance
                   .collection('users')
                   .doc(FirebaseAuth.instance.currentUser!.uid) // 👈 Your document id which is equal to currentUser's id
                   .snapshots(), 
          builder:
              (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.hasError) {
              return const Text('Something went wrong');
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Text("Loading");
            }
            Map<String, dynamic> data =
                snapshot.data!.data()! as Map<String, dynamic>;
            return Text(data['fullName']); // 👈 your valid data here
          },
        ),
      ),
    );
  }

未来建筑师

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>(
        future: FirebaseFirestore.instance
            .collection('users')
            .doc(FirebaseAuth.instance.currentUser!.uid)  // 👈 Your document id which is equal to currentUser's id
            .get(),
        builder: (_, snapshot) {
          if (snapshot.hasError) return Text('Error = ${snapshot.error}');
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Text("Loading");
          }
          Map<String, dynamic> data = snapshot.data!.data()!;
          return Text(data['fullName']); //👈 Your valid data here
        },
      )),
    );
  }

另请参阅:How to use StreamBuilder and FutureBuilder for single and multiple documents

相关问题