Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振未来:等待侦听器至少完成一次_Flutter_Dart_Google Cloud Firestore_Stream - Fatal编程技术网

Flutter 颤振未来:等待侦听器至少完成一次

Flutter 颤振未来:等待侦听器至少完成一次,flutter,dart,google-cloud-firestore,stream,Flutter,Dart,Google Cloud Firestore,Stream,我试图在包含侦听器的函数上实现未来的返回。我希望在监听器至少返回一次数据时完成此操作。我没有使用async/await,因为listen函数不是未来的功能。因此,我的选择如下: static Future listenForConsumption() async { Completer completer = Completer(); try { kConsumptionCollection .where("userId", isEqualTo:

我试图在包含侦听器的函数上实现未来的返回。我希望在监听器至少返回一次数据时完成此操作。我没有使用async/await,因为listen函数不是未来的功能。因此,我的选择如下:

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;
  }
通过使用补全符,我试图等到侦听器完成。但是,调用此函数的函数似乎并不等待将来完成:

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

有没有关于可能缺少什么的想法?

使用以下方法:

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);
    }
}