Firebase 异步函数中的返回值-颤振

Firebase 异步函数中的返回值-颤振,firebase,dart,flutter,google-cloud-firestore,Firebase,Dart,Flutter,Google Cloud Firestore,使用CloudFireStore作为我的数据库。 我需要在我的代码中从两个单独的文档中读取数据,根据上一个文档中的值从一个文档中获取数据 在将来的方法中从firestore获取数据,如下所示: Future<List<Map<String, dynamic>>> getGenAlertsData() async{ QuerySnapshot alertRef = await Firestore.instance.collection('alerts'

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

在将来的方法中从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;

}
Future getGenAlertsData()异步{
QuerySnapshot alertRef=await Firestore.instance.collection('alerts').orderBy('time',descending:true)。getDocuments();
列表消息=新列表();
地图信息;
//int计数器=0;
alertRef.documents.forEach((doc)异步{
//计数器++;
字符串senderKey、senderNameKey、senderSpecKey、senderPicKey、msgBodyKey、timeKey、sender、senderName、senderSpec、msgBody、senderPic;
senderKey='sender';
发送方=单据[‘发送方’];
timeKey='time';
日期时间=doc['time'];
打印(时间);
msgBodyKey='msgBody';
msgBody=doc['msgBody'];
DocumentReference ref=Firestore.instance.document('/staff/'+sender);
打印(参考文档ID);
等待ref.get()。然后((onValue){//此处未填充值:(
senderName='senderName';
senderName=onValue['name'];
打印(发送名称);
senderPicKey='senderPic';
senderPic=onValue['profilePic'];
senderSpecKey='specialization';
senderSpec=onValue['specialization'];
});
//等待打印(senderName);
完整消息={
senderKey:sender,
senderName:senderName,
senderSpecKey:senderSpec,
senderPicKey:senderPic,
时间键:时间,
msgBodyKey:msgBody,
};
messages.add(fullMessage);
print(messages.toString());//我在这里的控制台中打印消息
});//循环集合到此结束
打印(messages.toString());//此处没有数据:(
返回消息;
}
此时,只有来自
alertRef.documents.forEach((doc)
的值可用,
中的值等待ref.get()。然后((onValue){
不填充(它们在
fullMessage
映射中为空)


任何帮助都将不胜感激。

耶!终于解决了

显然,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;


} 
Future getGenAlertsData()异步{
QuerySnapshot alertRef=await Firestore.instance.collection('alerts').orderBy('time',descending:true)。getDocuments();
列表消息=新列表();
地图信息;
//字符串xxx;
字符串senderKey、senderNameKey、senderSpecKey、senderPicKey、msgBodyKey、timeKey、sender、senderName、senderSpec、msgBody、senderPic;
列表alertSnaps=alertRef.documents;
对于(int i=0;i