我在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());
});
}
该函数应等待流获得完成=将来的真实答案。
答案 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;
}
但是,我看到您在这里混淆了很多概念。
函数的名称表明它正在处理Stream
,但是您返回的是Future
。您不应该在同一函数中同时使用Stream
和Future
两个概念。这很令人困惑。
您正在传递回调func
,但是当您已经返回Future
时不打算使用这些回调,因为您可以在{{ 1}}解决。
我会这样重写此功能:
func
呼叫者:
Future