【问题标题】:Getting current user's data from firebase firestore in flutter在颤振中从firebase firestore获取当前用户的数据
【发布时间】:2022-01-17 10:13:54
【问题描述】:

我想从 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']

【问题讨论】:

  • uuid 的值是多少?打印(uuid)

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

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

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

【讨论】:

  • 它给了我这样的错误:“错误:没有为类型 'DocumentSnapshot>' 定义 getter 'docs'。([sportal] lib 的 undefined_getter \screens\messageSearch_s.dart:71)"
【解决方案2】:

在 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()); // ?

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2020-08-01
    • 1970-01-01
    • 2022-10-06
    • 2020-07-20
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多