【发布时间】:2021-12-31 19:24:25
【问题描述】:
当我尝试从 Flutter 中的 Future<bool> 中获取布尔结果时出现错误。场景是,我试图在与我的项目关联的 Firebase Firestore 中进行查询,并检查查询是否不包含任何项目。因此,我使用这个 sn-p 来做这个查询并将它作为 Future<bool> 返回:
static Future<bool> checkDupTitle (String uid, String title) {
return FirebaseFirestore.instance
.collection(DBCollection.summits.toString())
.where(SummitWhirlwindModel.UID, isEqualTo: uid)
.where(SummitWhirlwindModel.TITLE, isEqualTo: title)
.snapshots().isEmpty;
}
为了从Future<bool> 中得到布尔结果,我尝试了async/await 和.then 语法。不幸的是,它们都不起作用。例如,当我使用.then时,我得到containsDup的布尔值分配给null,下面是函数调用:
bool isValid(String uID) {
Future<bool> containsDupFuture = checkDupTitle(uID, this.title.value);
bool containsDup;
containsDupFuture.then((value) => containsDup = value);
return !containsDup;
}
谁能帮我解决这个问题?我是新来的,当我在 Stackoverflow 上查找相关问题时,我无法得到任何有价值的答案。非常感谢您提前回答这个问题!!!
【问题讨论】:
-
一旦
Future完成,您传递给then的函数就会被执行。同时,程序继续执行。在您的示例中,调用了 return 语句 - 由于尚未设置containsDub- 它返回 null。 -
那么您能告诉我如何消除这种竞争条件吗? @StefanGaller
-
我相信我只在
.then子句中设置了containsDup,它等待Future完成。 -
Future
isValid(String uID) async { bool containsDup = await checkDupTitle(uID, this.title.value);返回 !containsDup; } -
@StefanGaller 感谢您的回答。但是,标记为
async的函数必须具有可分配给Future的返回类型。也就是说,当我们想从Future<bool>中取出bool时,这将不起作用。
标签: firebase flutter dart asynchronous google-cloud-firestore