【发布时间】:2020-12-10 01:17:16
【问题描述】:
我是 Flutter 的新手,如果这个问题看起来微不足道或无关紧要,我很抱歉!
我创建了另一个用于获取和设置数据的类Repository,因为我使用 Cloud Firestore,我想要针对这个特定问题的数据存储在一个集合中,所以我将集合中的所有文档都作为 @ 987654323@,然后将所有文档添加到List<DocumentSnapshot>。
方法如下:
Future<List<DocumentSnapshot>> getCollection(CollectionReference colRef) async {
List<DocumentSnapshot> dummyList = new List();
await colRef.getDocuments().then((value) {
dummyList.addAll(value.documents);
});
return dummyList;
}
存储库:
CollectionReference memoriesColRef =
_firestore
.collection("username")
.document("memories")
.collection("allMem");
List<DocumentSnapshot> documentList = new List();
await getCollection(memoriesColRef).then((value) {
documentList.addAll(value);
});
毕竟,我在我的 UI 类中设置了一个方法,调用它 Repository,当我在 build 函数中调用它时,它可以完美运行,我已经传递给访问的全局列表数据,无法在其中添加值
UI 类
build(...) {
getMemories().then((value) {
print("value size: " + value.length.toString()); // 1
memoriesListMap.addAll(value); // global variable
});
print("valSize: " + memoriesListMap.length.toString()); // 0
print("val: " + memoriesListMap[0]["title"]); // error line
}
Future<List<Map<String, dynamic>>> getMemories() async{
List<Map<String, dynamic>> dummyListMap = new List();
await MemoryOper().getMemories().then((value) {
print("memVal: " + value[0]["title"]); // appropriate value
dummyListMap.addAll(value);
});
return dummyListMap;
}
错误
RangeError (index): Invalid value: Valid value range is empty: 0\
我不知道是什么原因造成的,但请帮帮我!谢谢
编辑:
ListView.builder(
itemBuilder: (BuildContext context, int index) {
String title = memoriesListMap[index]["title"]; // error prone line
int remind = memoriesListMap[index]["remind"];
String link = memoriesListMap[index]["link"];
【问题讨论】:
-
这能回答你的问题吗? What is a Future and how do I use it?
-
注意“我如何使用它”部分。如果你想构建依赖于 Future 结果的东西,你需要
FutureBuilder。 -
作为个人附注,尽量不要混用
.then()和await。对于 Futures 和 async/await 的新手来说,这可能会非常令人困惑。一旦您了解它们的方式,将两者一起使用并没有错,但对于初学者来说,如果您选择其中一个会更容易。我建议await,这样更难犯这样的错误。 -
理想情况下,如果我遵循这个答案,我应该能够形成一个解决方案,对吧?
-
是的,确实如此。无论是假设的披萨外卖还是从 Firestore 加载东西,“我稍后获取数据,我该怎么办?”的概念。总是一样的。
标签: flutter asynchronous dart google-cloud-firestore future