【问题标题】:Cannot retrieve Firebase data无法检索 Firebase 数据
【发布时间】:2020-07-07 00:09:14
【问题描述】:

我有一个 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 等函数,但无法到达 non_updated_area 之外的更新后的 accountNames

你有解决办法吗?

【问题讨论】:

  • 第二个调用是否在第一个调用之前运行,即。你看到 null,然后是正确的列表吗?
  • 这是真的@GrahamD,输出是这样的:flutter: [] Reloaded 13 of 568 libraries in 369ms. flutter: [list_item]
  • 实时数据库和 Cloud Firestore 是两个完全独立的数据库。请在以后只标记您要询问的数据库。

标签: firebase flutter google-cloud-firestore


【解决方案1】:

原因是您的第二个打印语句在对数据库的调用完成之前运行,因此没有返回数据供它打印。不知道为什么你需要第二次打印相同的信息,但如果你打算用一些数据处理来替换那个打印,那么它就不会在那里工作。您需要处理在.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);

【讨论】:

  • 好吧,我的目标是在这个函数之外到达更新的accountNames 列表。例如。从另一个函数或小部件调用它。如何在 .then 块之外传递数据?
【解决方案2】:

由于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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多