无法检索Firebase数据

时间:2020-03-26 11:11:28

标签: firebase flutter google-cloud-firestore

我有一个Flutter项目,正在使用Firebase。一切工作正常,我可以读写更新数据。但是,在我的一个类中,我需要从Firebase获取一个我的属性之一的列表:

var accountNames = List<String>();

  _getData(BuildContext context) {
    List<String> accountList = [];

    final accounts = _database.collection('userAccounts').getDocuments().then((snapshot) {
      snapshot.documents.forEach((f) {
          accountNames.add(f['accountName']);
          print(accountNames); //first call
      });
    }); // non_updated_area 
    print(accountNames); //second call
}

在这里,我对accountName 的第一次调用给出了正确的输出。但是,第二个调用给出了null 。我尝试了几种方法,例如返回List,Widget等功能,但无法在accountNames 之外访问更新后的non_updated_area

您对此有解决方案吗?

2 个答案:

答案 0 :(得分:1)

由于getDocuments()是异步的,因此在完全从Firestore中检索数据之前,将调用then()方法外部的数据。

您可以使用asyncawait

 _getData(BuildContext context) async {
    List<String> accountList = [];

    final accounts = await _database.collection('userAccounts').getDocuments();
      accounts.documents.forEach((f) {
          accountNames.add(f['accountName']);
          print(accountNames);
      }); 
    print(accountNames); //second call
}

答案 1 :(得分:0)

原因是您的第二个打印语句在对数据库的调用完成之前运行,因此没有返回要打印的数据。不确定为什么需要第二张相同信息的打印纸,但是如果您打算用某些数据处理来替换该打印纸,那么它将无法在那里工作。您需要处理.then块内返回的数据。或者,您需要使用Dart中的async / await构造。

更新 根据您的评论:

好吧,我的目标是在此功能之外访问更新的accountNames列表。例如。从另一个函数或小部件调用它。如何在.then块之外传递数据?

有几种方法,但是给定您的代码,最简单的方法是将该函数更改为Future>并在.then块中使用return语句,例如:

Future<List<String>> getData(BuildContext context) {
    List<String> accountNames = List<String>();

  _database.collection('userAccounts').getDocuments().then((snapshot) {
      snapshot.documents.forEach((f) {
          accountNames.add(f['accountName']);
      });
      return accountNames;
    });
}

然后将其命名为:

var accountNameList = await getData(context);