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

Asynchronous 如何使用异步函数异步侦听Firestore中的值?,asynchronous,flutter,dart,google-cloud-firestore,future,Asynchronous,Flutter,Dart,Google Cloud Firestore,Future,我在Flatter中有一个异步函数,它与Firestore通信。 有一个运行的服务器函数,我的任务完成指示是我使用StreamSubscription监听的标志。 StreamSubscription侦听代码使用Future异步函数包装,但我不明白如何从StreamSubscription的函数处理程序返回Future static Future<bool> listenToProcess( String doc, Function func) { StreamSubscr

我在Flatter中有一个异步函数,它与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());
  });
}

函数应等待流获得“完成=真实”的未来答案。

您可以在以下情况下使用:

静态未来ListentProcessString文档,函数func{ 最终完成者=完成者; 最终流=Firestore.instance .collection'requests'.documentdoc.snapshots.listenda{ ... completer.completedata.data[完成]; }; 返回completer.future; } 但是,我看到您可能混淆了一些概念

函数名表示它正在处理流,但返回的是未来。您不应该在同一个函数中同时使用Stream和Future概念。这有点令人困惑

您正在传递回调func,但当您已经返回Future时,不能使用回调func,因为您可以在Future解析时调用func

我会像这样重写这个函数:

静态未来CheckIfRequestIsDocString文档异步{ //仅检索第一个快照。无需侦听它。 DocumentSnapshot snapshot=等待Firestore.instance .collection'requests'.documentdoc.snapshots.first; 返回快照[完成]; } 打电话的人:

bool isRequestDone=等待checkIfRequestIsDonedoc; //一旦知道请求是否完成,立即调用服务器函数。 //不需要回拨。 服务器功能要求完成;
非常感谢你的详尽回答,完成者工作得很有魅力。但isRequestDone方法并不太好,因为我需要等待答案为真。如果为false,代码将继续执行serverFunction,否?然后在调用serverFunction之前检查isRequestDone是否为true:如果isRequestDone serverFunctiontrue;。我真的认为你应该考虑这一点,因为正如我所解释的,你最初的实现是混合了很多概念。是的,我做了什么来省略FUNC代码。我不知道我如何简单地使用if isRequestDone,因为我必须以某种方式继续检查它。。我当然不会循环检查,即使没有计时器。。我认为流方法是可以的,只要我在它变为真后取消它。