繁体   English   中英

从 flutter 中的 firebase firestore 获取当前用户的数据

[英]Getting current user's data from firebase firestore in flutter

我想从 Firestore 获取数据,但我似乎无法正确执行,它总是返回 null。 这是我尝试过的:

Map<String, dynamic>? userMap2;

void getCurrentUser() async {
FirebaseFirestore _firestore = FirebaseFirestore.instance;

final User? user = _auth.currentUser;
final uuid = user!.uid;

setState(() {
  isLoading = true;
});

await _firestore
    .collection('users')
    .where("uid", isEqualTo: uuid)
    .get()
    .then((value) {
  setState(() {
    userMap2 = value.docs[0].data();
    isLoading = false;
  });
  print(userMap2);
});

}

当我尝试使用该数据时,我尝试像这样使用它: userMap2!['firstName']

尝试将用户数据放入文档中然后使用,

     _firestore
     .collection('users')
     .doc(uuid)
     .get().then((value) {
      setState(() {
      userMap2 = value.docs[0].data();
      isLoading = false;
  });
   print(userMap2);
 });

在 React 中,调用setState是一个异步操作。 此外,从 Firestore 加载数据是一个异步操作。 这意味着在您当前的代码中, print(userMap2)在调用then回调之前运行,甚至在userMap2 = value.docs[0].data()完成之前运行。

我建议不要将thenawait结合使用,并执行以下操作:

const value = await _firestore // 👈
    .collection('users')
    .where("uid", isEqualTo: uuid)
    .get();
setState(() {
  userMap2 = value.docs[0].data();
  isLoading = false;
});
print(value.docs[0].data()); // 👈

在我标记的第一行,我们现在从await ed get()返回值,因此我们不再需要then块。 这处理了对 Firestore 的调用的异步性质。

然后在第二个标记的行上,我们直接从数据库的结果中打印值,而不是从setState调用。 这解决了调用setState的异步性质。

有关这些的更多信息,请参阅:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM