等待“未来:颤动”中的流

时间:2020-06-10 10:05:28

标签: firebase flutter firebase-realtime-database

我想检查Firebase数据库是否已连接,所以我必须使用Future来返回布尔值

检查一下我的代码。

@override
Future<bool> isAvailable() async {
 bool ret = false;
 await firebaseInstance.reference().child('.info/connected').onValue.listen((event) {
  ret =  event.snapshot.value;
});

return ret;
}

firebaseInstace.reference是一种StreamSubscription类型,它不等待将来向我返回结果。

请帮助。

4 个答案:

答案 0 :(得分:2)

如果您只需要知道当前值,请使用once().then代替onValue.listen

@override
Future<bool> isAvailable() async {
  var snapshot = await firebaseInstance.reference().child('.info/connected').once();
  return snapshot.value;
}

答案 1 :(得分:0)

您可以将StreamSubcription放在变量中

StreamSubscription subscription = someDOMElement.onSubmit.listen((data) {

   // you code here

   if (someCondition == true) {
     subscription.cancel();
   }

});

更多信息可以在这里is there any way to cancel a dart Future?

答案 2 :(得分:0)

您可以执行以下操作:

@override
  Future<bool> isAvailable() async {
    bool ret = false;
    Stream<Event> events =
        FirebaseDatabase.instance.reference().child('.info/connected').onValue;
    await for (var value in events) {
      ret = value.snapshot.value;
    }
    return ret;
  }

onValue返回一个Stream<Event>,然后您可以使用await for在Stream中进行迭代并获取数据,然后它将返回。

答案 3 :(得分:0)

不用等待流订阅的结束(它永远不会结束),只需取first值:

@override
Future<bool> isAvailable() => firebaseInstance.reference().child('.info/connected').onValue.first;