【问题标题】:Flutter Futures: Waiting for listener to complete at least onceFlutter Futures:等待侦听器至少完成一次
【发布时间】: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

关于可能缺少什么的任何想法?

【问题讨论】:

    标签: flutter dart google-cloud-firestore stream


    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多