【问题标题】:Returning values in async functions - Flutter在异步函数中返回值 - Flutter
【发布时间】:2018-09-01 13:04:34
【问题描述】:

使用 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;

}

此时只有alertRef.documents.forEach((doc) 中的值可用,await ref.get().then((onValue) { 中的值未填充(它们在fullMessage 映射中为空)。

任何帮助将不胜感激。

【问题讨论】:

    标签: firebase dart flutter google-cloud-firestore


    【解决方案1】:

    耶!终于明白了!

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

    将它全部放在一个好的旧 for 循环中,现在一切都很好。

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

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 2020-07-07
      • 2021-03-05
      • 2022-01-14
      • 2021-11-30
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多