Возвращение значений в асинхронных функциях - Flutter - PullRequest
0 голосов
/ 01 сентября 2018

Использование Cloud Firestore в качестве моей БД. Мне нужно прочитать данные из двух отдельных документов в моем коде, получить данные из документа на основе значения в предыдущем документе.

Получение данных из хранилища в методе Future, который выглядит следующим образом:

  Future<List<Map<String, dynamic>>> getGenAlertsData() async{

  QuerySnapshot alertRef = await Firestore.instance.collection('alerts').orderBy('time', descending: true).getDocuments();

  List<Map<String, dynamic>> messages = new List();
  Map<String, dynamic> fullMessage;

// int counter = 0;

  alertRef.documents.forEach((doc) async {
    // counter++;
    String senderKey, senderNameKey, senderSpecKey, senderPicKey, msgBodyKey, timeKey, sender, senderName, senderSpec, msgBody, senderPic;
    senderKey = 'sender';
    sender = doc['sender'];
    timeKey = 'time';
    DateTime time = doc['time'];
    print(time);
    msgBodyKey = 'msgBody';
    msgBody = doc['msgBody'];
    DocumentReference ref = Firestore.instance.document('/staff/'+sender);
    print(ref.documentID);

    await ref.get().then((onValue) { //values not populated here :(
      senderNameKey = 'senderName';
      senderName =  onValue['name'];
      print(senderName);
      senderPicKey = 'senderPic';
      senderPic =   onValue['profilePic'];
      senderSpecKey = 'specialization';
      senderSpec =  onValue['specialization'];
    });

    // await print(senderName);
    fullMessage = <String, dynamic> {
      senderKey: sender,
      senderNameKey: senderName,
      senderSpecKey: senderSpec,
      senderPicKey: senderPic,
      timeKey: time,
      msgBodyKey: msgBody,
    };


    messages.add(fullMessage);

    print(messages.toString()); // I get the messages printed in my console here

  }); //loop over collection ends here

  print(messages.toString()); // No data here :(

    return messages;

}

На данный момент доступны только значения из alertRef.documents.forEach((doc), а значения внутри await ref.get().then((onValue) { не заполняются (они равны нулю на карте fullMessage).

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 сентября 2018

Yaay! Наконец-то разобрался!

Видимо, then () не работает так хорошо внутри асинхронных функций, теперь мой код выглядит так, и теперь все отлично! :)

Поместите все в старый добрый цикл, и теперь все в порядке.

Future<List<Map<String, dynamic>>> getGenAlertsData() async{

  QuerySnapshot alertRef = await Firestore.instance.collection('alerts').orderBy('time', descending: true).getDocuments();
  List<Map<String, dynamic>> messages = new List();
  Map<String, dynamic> fullMessage;
  // String xxx;

  String senderKey, senderNameKey, senderSpecKey, senderPicKey, msgBodyKey, timeKey, sender, senderName, senderSpec, msgBody, senderPic;


  List<DocumentSnapshot> alertSnaps= alertRef.documents;

  for (int i = 0; i < alertSnaps.length; i++)

  {
    senderKey = 'sender';
    sender = alertSnaps[i]['sender'];
    timeKey = 'time';
    DateTime time = alertSnaps[i]['time'];
    print(time);
    msgBodyKey = 'msgBody';
    msgBody = alertSnaps[i]['msgBody'];
    DocumentSnapshot snappy = await Firestore.instance.document('/staff/'+sender).get();
      senderNameKey = 'senderName';
      senderName = snappy['name'];
      print('Doc for sender' + senderName);
      senderPicKey = 'senderPic';
      senderPic =  snappy['profilePic'];
      senderSpecKey = 'specialization';
      senderSpec = snappy['specialization'];

      fullMessage = <String, dynamic> {
      senderKey: sender,
      senderNameKey: senderName,
      senderSpecKey: senderSpec,
      senderPicKey: senderPic,
      timeKey: time,
      msgBodyKey: msgBody,};

      messages.add(fullMessage);
  }

  return messages;


} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...