Firebase侦听功能中的代码不会立即执行

问题描述

我正在尝试侦听数据库更改并更新我的数据。但是问题是该函数没有立即进入我的for循环内,并且我的函数总是返回null。您有什么想法吗? / p>

Future<InfoCompagnie> getPlace(
      {String compagnie,String dep,String arr,String jour,int nbrPlace}) async {
    var infoCompagnie = InfoCompagnie().obs;
    db
        .collection('PLACE')
        .document(compagnie)
        .collection('$dep-$arr')
        .document(jour)
        .collection('Bus')
        .where('Placedisponible',isGreaterThanorEqualTo: 2)
        .snapshots(includeMetadataChanges: true)
        .listen((document) {
      for (var data in document.documents) {
        if (data.exists) {
          codeBus = data.data['CodeBus'];
          infoCompagnie.update((value) {
            value.accessiblePlace = accessiblePlace;
          });
          return infoCompagnie.value;
        } else
          return null;
      }
    });
  }

解决方法

触发器的激活取决于不同的情况,例如,取决于您的连接速度和状态,可能需要几百毫秒到几秒钟才能获得该数据。 Firestore会异步加载数据,因为这可能需要一些时间。

如果您想更好地了解其工作原理,请检查此document

如本documentation中所述,您可以使用带有'async'和'await'关键字的Future编写异步代码。

如果您需要管理同步操作,可以在此document上找到有用的示例,例如:

import 'package:synchronized/synchronized.dart';

main() async {
  // Use this object to prevent concurrent access to data
  var lock = new Lock();
  ...
  await lock.synchronized(() async {
    // Only this block can run (once) until done 
    ...
  });
}