我正在写一个语言字典使用Flutter与Firestore。我有数据库名为'西班牙语'和2个文档'容易'和'困难'。每个文档是一组对-一个关键字是原来的西班牙语单词和价值是这个单词的翻译。
我想找出哪些键(原始西班牙语单词)同时出现在'easy'和'difficult'文档中。我的查询(不起作用)是:
var myResult = await FirebaseFirestore.instance
.collection('Spanish')
.doc('easy')
.get()
.then((snapshot) {
if (snapshot != null) {
snapshot.data()?.forEach((key, value) {
var myData2 = **checkIfSelected**(key);
print(myData2) ;
});
Future<dynamic> checkIfSelected(String key) async {
bool ifSelected = false;
var myResult2 = await FirebaseFirestore.instance
.collection('Spanish')
.doc('difficult')
.get()
.then((snapshot) {
if (snapshot != null) {
snapshot.data()?.forEach((k, v) {
if (k == key) {
ifSelected = true;
}
}
});
return ifSelected;
}
为什么不工作?我做了很多显示,我从引用的代码中删除了这些显示,但是函数checkIfSelected返回**'Future'的示例**而不是bool。这是一个带有await的异步函数,所以据我所知,它不应该返回Futures。我尝试进行更改:
var myData2 = await checkIfSelected(key);
但出现错误:
await表达式只能用于异步函数中。请尝试使用“async”或“async *”标记函数体。dart(await_in_wrong_context)
但是checkIfSelected
已经是async
函数了。
你知道我在代码中做错了什么吗,或者可能有另一种方法来解决这个问题?
4条答案
按热度按时间mum43rcc1#
试试看这边,
注意事项:
异步调用不支持.forEach(),需要使用传统的循环。为什么?这个article解释得很好。我刚刚发现Dart和Node.JS几乎一样。
vxf3dgd42#
我编写了另一种方法来获取在简单文档和困难文档中都出现的单词:
您可以这样调用它,它将搜索它们并返回一个包含以下西班牙语单词的列表:
fhg3lkii3#
如果要使用
async
/await
,则不应使用then
。如果只是前者,那就是:
oogrdqng4#
这部分代码缺少async关键字。