#flutter #asynchronous #dart #google-cloud-firestore
# #флаттер #асинхронный #dart #google-cloud-firestore
Вопрос:
У меня возникла проблема при попытке сохранить данные из Firestore в локальную переменную.
class AppUser {
String _userId;
Map<String, dynamic> _userData;
Future getUserDataFromDb() async {
_userData = await dbInterface.getFinancialsFromDB(_userId);
// dbInterface.getFinancialsFromDB(_userId).then((Map<String, dynamic> data) {
// _userData = data;
// });
print(_userData); // flutter: null
}
}
_userData всегда возвращает null .
class Db {
CollectionReference financials = FirebaseFirestore.instance.collection('financials');
Future<Map<String, dynamic>> getFinancialsFromDB(userId) async {
financials.doc(userId).get().then((DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists) {
print(documentSnapshot.data()); // flutter: {'key1': 'data1', ...}
return documentSnapshot.data();
}
});
return null;
}
}
Db dbInterface = Db();
В «getFinancialsFromDB» -функция печатает правильную карту. Таким образом, проблема заключается не в том, чтобы извлечь данные из Firestore, а в том, чтобы сохранить их в переменной _userData .
getUserDataFromDb() вызывается в initState .
Есть идеи, что я мог бы сделать, чтобы исправить эту проблему? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Большое спасибо, я действительно ценю любую помощь.
Всего наилучшего,
Алекс
Ответ №1:
При написании кода в async
функции in не используйте then
. Вместо этого используйте await
для получения результата будущего.
Future<Map<String, dynamic>> getFinancialsFromDB(userId) async {
var documentSnapshot = await financials.doc(userId).get();
if (documentSnapshot.exists) {
return documentSnapshot.data();
}
else {
return null;
}
}