如何从Cloud_Firestore获取单个文档数据到我的变量?

时间:2020-08-19 05:09:09

标签: firebase flutter dart google-cloud-firestore

我一直在尝试从Firestore获取单个数据。但是我不能。

void _onPressed() async{
    var firebaseUser = await FirebaseAuth.instance.currentUser();
    var userData;
    firestoreInstance.collection("users").document(firebaseUser.uid).get().then((value){
      setState(){
      userData = value.data
      }
      print('Value data = ${value.data}');
    });
   print('UserData = ${userData}'); 
  }

结果:

Value data = { some data some data}
UserData = null

为什么我的userData为空?我该如何解决?我期待着您的回音。

3 个答案:

答案 0 :(得分:2)

get()是异步的,并在查询完成之前立即返回。 then()也是异步的(以及任何返回Future的东西)。使用await而不是then暂停代码,直到获得结果为止。

var snapshot = firestoreInstance.collection("users").document(firebaseUser.uid).get()
var userData = snapshot.data
print('UserData = ${userData}')

答案 1 :(得分:2)

您必须执行以下操作:

void _onPressed() async{
    var userData;
    var firebaseUser = await FirebaseAuth.instance.currentUser();
    var result = await firestoreInstance.collection("users").document(firebaseUser.uid).get(); 
    setState((){
      userData = result.data;
     });
  }

由于get()是异步的,因此请使用await等待结果,之后您可以调用setState(),它将使用新数据重建布局。


如果您使用的是cloud_firestore: 0.14.0+,请使用以下代码:

void _onPressed() async{
    var userData;
    var firebaseUser = FirebaseAuth.instance.currentUser;
    var result = await FirebaseFirestore.instance.collection("users").doc(firebaseUser.uid).get(); 
    setState((){
      userData = result.data();
     });
  }

答案 2 :(得分:1)

因为您将此行放在了then函数之外。

print('UserData = ${userData}'); 
firestoreInstance.collection("users").document(firebaseUser.uid).get().then((value){
      setState(){
      userData = value.data
      }
      print('Value data = ${value.data}');
    });
print('UserData = ${userData}'); //Since this line is outside the then function. 

// This line will be execute before the then function(then function will execute after getting the data from firebase)