【问题标题】:Flutter getting bool out of Future<bool> but got null assigned to the Boolean variableFlutter 从 Future<bool> 中获取 bool 但将 null 分配给 Boolean 变量
【发布时间】:2021-12-31 19:24:25
【问题描述】:

当我尝试从 Flutter 中的 Future&lt;bool&gt; 中获取布尔结果时出现错误。场景是,我试图在与我的项目关联的 Firebase Firestore 中进行查询,并检查查询是否不包含任何项目。因此,我使用这个 sn-p 来做这个查询并将它作为 Future&lt;bool&gt; 返回:

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&lt;bool&gt; 中得到布尔结果,我尝试了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&lt;bool&gt; 中取出 bool 时,这将不起作用。

标签: firebase flutter dart asynchronous google-cloud-firestore


【解决方案1】:

试试这个:

  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)
        .get().then((QuerySnapshot snapshot){
          if(snapshot.docs.length >0){
            return true;
          }else{
            return false;
          }
    });
  }

一定要初始化函数:

@override
void initState()   {
checkDupTitle (String uid, String title);  //provide uid,title
                     }

【讨论】:

  • 感谢您的回答!不幸的是,当从Future&lt;bool&gt; 中取出boolean 时,这仍然给我一个空值。
  • 你初始化函数了吗?,我编辑了答案。
  • 啊,明白了!但是我应该把intiState的这个初始化放在哪里,又会在哪里调用呢?
  • 课堂内的任何地方,或您的函数下方。
  • 如果我想使用initState,它必须在一个扩展State的类中。就我而言,此类不在State 下,因此我无法以这种方式初始化函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2023-01-03
  • 2023-04-11
  • 2019-07-08
  • 1970-01-01
  • 2021-10-16
  • 2021-10-10
相关资源
最近更新 更多