我一直在尝试从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
为空?我该如何解决?我期待着您的回音。
答案 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)