如何使用异步函数在Firestore中异步侦听值?

时间:2019-08-11 12:58:22

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

我在Flutter中有一个异步功能,可以与Firestore通信。 有一个服务器功能正在运行,并且我指示任务已完成的标志是我使用StreamSubscription监听的标志。 StreamSubscription侦听代码包装有Future异步函数,但我不明白如何从StreamSubscription的函数处理程序中返回Future。

static Future<bool> listenToProcess(
  String doc, Function func) {

  StreamSubscription<DocumentSnapshot> stream =  Firestore.instance.collection('requests').document(doc)
      .snapshots().listen((data){
    if (data.data["done"])
      func(true);
    print ("change " + data.data["done"].toString());
  });

}

该函数应等待流获得完成=将来的真实答案。

1 个答案:

答案 0 :(得分:1)

在以下情况下,您可以使用Completer

static Future<bool> listenToProcess(String doc, Function func) {
  Completer<bool> completer = Completer();

  StreamSubscription<DocumentSnapshot> stream = Firestore.instance
      .collection('requests').document(doc).snapshots().listen((data) {
        ...
        completer.complete(data.data["done"]);
      });

  return completer.future;
}

但是,我看到您在这里混淆了很多概念。

  1. 函数的名称表明它正在处理Stream,但是您返回的是Future。您不应该在同一函数中同时使用StreamFuture两个概念。这很令人困惑。

  2. 您正在传递回调func,但是当您已经返回Future时不打算使用这些回调,因为您可以在{{ 1}}解决。

我会这样重写此功能:

func

呼叫者:

Future