Flutter: не удается сохранить данные Firestore в локальную переменную (возвращает null)

#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;
    }
  }