Firebase 异步函数中的返回值-颤振
使用CloudFireStore作为我的数据库。 我需要在我的代码中从两个单独的文档中读取数据,根据上一个文档中的值从一个文档中获取数据 在将来的方法中从firestore获取数据,如下所示: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'
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