Flutter Futures:等待侦听器至少完成一次
Posted
技术标签:
【中文标题】Flutter Futures:等待侦听器至少完成一次【英文标题】:Flutter Futures: Waiting for listener to complete at least once 【发布时间】:2020-04-12 11:38:36 【问题描述】:我正在尝试在包含侦听器的函数上实现未来返回。当侦听器至少返回一次数据时,我想完成这个未来。我没有使用 async/await 因为监听功能不是未来。因此,我的选择如下:
static Future listenForConsumption() async
Completer completer = Completer();
try
kConsumptionCollection
.where("userId", isEqualTo: User.current.id)
.orderBy("consumptionDate", descending: true)
.snapshots()
.listen(
(data)
consumptionList = data.documents
.map((doc) => ConsumptionUnit.data(doc.documentID, doc.data))
.toList();
streamController.add(consumptionList);
completer.complete();
,
);
catch (err)
completer.complete();
throw (err);
return completer.future;
通过使用 Completer,我试图等待侦听器完成。但是,调用这个函数的函数似乎并没有等待未来完成:
void _checkForCurrentUser() async
try
await UserManager.fetchCurrentUser(); //Function waits for this
await Future.wait([
ConsumptionManager.listenForConsumption(),
BottleManager.listenForBottles(),
]); //Function does not wait for this
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Home()),
);
catch (err)
log("$err");
//...Rest of function
关于可能缺少什么的任何想法?
【问题讨论】:
【参考方案1】:使用这样的东西:
static void listenForConsumption(
@required Function onComplete,
@required Function onError,
) async
try
kConsumptionCollection
.where("userId", isEqualTo: User.current.id)
.orderBy("consumptionDate", descending: true)
.snapshots()
.listen(
(data)
consumptionList = data.documents
.map((doc) => ConsumptionUnit.data(doc.documentID, doc.data))
.toList();
onComplete(consumptionList);
,
);
catch (err)
onError(err);
【讨论】:
以上是关于Flutter Futures:等待侦听器至少完成一次的主要内容,如果未能解决你的问题,请参考以下文章
python 3.7.3 - concurent.futures的等待问题
如何从使用 Futures/async/await 的流中正确生成?
Windows 8 - 等待 Task<Bool> - 需要对已完成的侦听器进行异步回调
Flutter 中的 Dart Futures 问题:断言失败:第 146 行:'<optimized out>': is not true