Flutter:收听Firebase快照时如何返回布尔值?

时间:2019-02-27 16:33:20

标签: firebase asynchronous flutter

我正在尝试使用以下代码检查Firestore文档是否存在:

Future<bool> checkRegisterState2() async {

  bool _isregistered;

  await userRef.snapshots().listen((datasnapshot) {
      if (datasnapshot.exists) {
        _isregistered = true;
      }else{
        _isregistered = false;
      }
    });

    if(_isregistered){
      return true;
    }else{
      return false;
    }
  }

但似乎if-else语句没有等待firebase快照的结果,因此说_isregistered的值为空。

请问如果Firestore文档存在,返回真值的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

一种非常基本的方法是:

if (snapshot.hasError) return new Text('${snapshot.error}'); // or something similar

答案 1 :(得分:0)

首选.listen()胜过.then()的原因是什么?您是要在等待文档创建后再对文档做出反应,还是只希望查看用户是否存在?

对于调试,我特别喜欢print()语句。如果您在print(datasnapshot)之前添加if (datasnapshot.exists) {

,日志会告诉您什么?

另一件事:为什么不使用附加的if / else {}语句,为什么不简单地返回布尔值_isRegistered

答案 2 :(得分:0)

我还没有测试过,但是根据您的用例,您可以使用Stream或Future

Stream<bool> isRegistered() {
  return userRef.snapshots().map((DocumentSnapshot snapshot) => snapshot.exists)
}

Future<bool> isRegistered() async {
  return await userRef.get().then((DocumentSnapshot snapshot) => snapshot.exists)
}