【发布时间】:2021-11-13 18:41:27
【问题描述】:
我有一个双重“for in”循环,我需要扫描第一个汽车品牌和所有驾驶风格,然后下载我有用户投票的文档数量。 所以代码应该扫描一种驾驶风格,例如“运动”,并为每个人获取 firebase 中的文档数量(投票数)。
这是我的代码:
List<String> brands = [
'ferrari',
'porshe',
'lamborgini',
'bugatti',
'bentley',
];
List<String> drivingStyles = [
'sport',
'comfort',
'offroad',
];
Future getVotes(String brand, String drivingStyle) async {
try {
for (String brand in brands) {
for (String drivingStyle in drivingStyles) {
var query = FirebaseFirestore.instance
.collection('survey')
.doc('car_survey')
.collection('summer')
.where('brand', isEqualTo: brand)
.where('drivingStyle', isEqualTo: drivingStyle);
var querySnapshot = await query.get();
var numberOfVotes = querySnapshot.docs.length;
print('brand: $brand, drivingStyle: $drivingStyle');
//print('$numberOfVotes');
}
}
} catch (e) {
print('getVotes ERROR: $e');
}
当我只打印品牌名称和驾驶风格(for in 循环的结果)时,它看起来很完美,如下所示:
I/flutter ( 4723): brand: ferrari, drivingStyle: sport
I/flutter ( 4723): brand: ferrari, drivingStyle: comfort
I/flutter ( 4723): brand: ferrari, drivingStyle: offroad|
etc...
这正是我所期望的,
但是在激活await query.get() 之后,我得到了一个汽车品牌的一种驾驶风格,直到汽车品牌风格结束,然后通过所有汽车品牌再次获得下一种驾驶风格——这与我需要的相反,我不明白为什么激活await query.get() 后会发生变化。我基本上收到了这个:
I/flutter (12137): brand: ferrari, drivingStyle: sport
I/flutter (12137): brand: porshe, drivingStyle: sport
I/flutter (12137): brand: lamborghini, drivingStyle: sport
I/flutter (12137): brand: bugatti, drivingStyle: sport
I/flutter (12137): brand: bentley, drivingStyle: sport
I/flutter (12137): brand: ferrari, drivingStyle: comfort
I/flutter (12137): brand: porshe, drivingStyle: comfort
etc...
我需要读取一个品牌所有驾驶风格的值,然后将其保存为值。
似乎我在 for in 循环中等待 Future 时遇到问题。你能看看并告诉我我做错了什么吗?
非常感谢。
【问题讨论】:
-
您的代码看起来不错。在您包含您的 firebase 功能并在哪里打印 numberOfVotes 后,我们可以看到
getVotes。 -
嗨@PeterO。并感谢您的意见。我刚刚更新了问题。
-
我刚刚运行了你的函数,我注意到了一些东西。传递给
getVotes函数的值正在由for 语句更新。这是预期的行动吗?那可能是错误的来源吗?因为我在没有将任何参数传递给getVotes的情况下运行了您的代码并且它按预期工作。 -
您是指从外部传递给
getVotes的值brand和drivingStyle?它们是如何通过 for 语句更新的?没有任何意图。基于这些值,我只需要读取集合中有多少票(querySnapshot.docs.length),所以当 Firestore 路径发生变化时,我得到的数字(int)正在被进一步处理......
标签: firebase flutter google-cloud-firestore async-await