Как получить данные одного документа из Cloud_Firestore в мою переменную?

#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)