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

Firestore,Flutter,Async:方法不等待异步方法完成