【问题标题】:Wait for stream inside a Future: Flutter在 Future 中等待流:Flutter
【发布时间】:2020-09-29 17:03:38
【问题描述】:

我想检查 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 类型,不会等待未来返回结果。

请帮忙。

【问题讨论】:

  • 你试过我的答案了吗?

标签: firebase flutter firebase-realtime-database


【解决方案1】:

您可以将 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】:

    您可以执行以下操作:

    @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&lt;Event&gt;,然后你可以使用await for在Stream内部迭代获取数据,然后返回。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你救了我!谢谢
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-12
        • 2020-08-04
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 2019-03-02
        • 1970-01-01
        • 2022-01-13
        相关资源
        最近更新 更多