在异步函数中返回值 - Flutter

问题描述 投票:0回答:1

使用Cloud Firestore作为我的数据库。我需要从我的代码中的两个单独的文档中读取数据,根据前一个文档中的值从文档中获取数据。

在Future方法中从firestore获取数据,如下所示:

  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;

}

此时只有来自qazxsw poi的值可用,并且qazxsw poi中的值未填充(它们在alertRef.documents.forEach((doc) Map中为null)。

任何帮助将不胜感激。

firebase dart flutter google-cloud-firestore
1个回答
0
投票

Yaay!终于搞清楚了!

显然,then()在异步函数中效果不好,现在我的代码看起来像这样,现在一切都很好! :)

把它放在一个很好的旧循环中,现在一切都很好。

await ref.get().then((onValue) {
© www.soinside.com 2019 - 2024. All rights reserved.