#firebase #flutter #dart #google-cloud-firestore
#firebase #флаттер #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
null? Как мне это решить? Я с нетерпением жду вашего ответа.
Ответ №1:
get()
является асинхронным и возвращается непосредственно перед завершением запроса. then()
также является асинхронным (как и все, что возвращает Future). Используйте await
вместо then
, чтобы приостановить выполнение кода до получения результата.
var snapshot = firestoreInstance.collection("users").document(firebaseUser.uid).get()
var userData = snapshot.data
print('UserData = ${userData}')
Ответ №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();
});
}
Ответ №3:
Поскольку вы поместили эту строку за пределы функции 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)