我有一个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
。
您对此有解决方案吗?
答案 0 :(得分:1)
由于getDocuments()
是异步的,因此在完全从Firestore中检索数据之前,将调用then()
方法外部的数据。
您可以使用async
和await
:
_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);