【发布时间】:2020-10-19 02:59:53
【问题描述】:
我正在尝试从 Firestore 中检索文档 ID 列表。 我的 firestore 函数作为静态方法存储在我创建的 FirebaseAPI 类中。
这是应该返回 documentIds 列表的函数:
static List<String> avaiableDocuments() {
List<String> ids = [];
final Future<QuerySnapshot> snapshot = Firestore.instance.collection('admin').getDocuments();
snapshot.then((value) {
value.documents.forEach((element) {
ids.add(element.documentID);
});
});
return ids;
}
当我重新启动应用程序时,没有出现文档 ID 列表。 但是,它们会在热重载时出现。
我的理解是,当应用重新启动时,字符串列表仍然是空的。 这是因为页面在未来返回之前呈现。 然后当热重载再次调用 build 方法时,列表已经被填充,所以它会显示它。
我尝试在 getDocuments 调用之前添加“等待”。 这将 Future 变成了 QuerySnapshot。很公平。 现在必须将“异步”添加到函数中。 那么这个函数现在需要一个未来的返回而不是一个列表。
我不能从这个函数中得到一个列表吗?
我尝试过,结果是这样的:
static Future<List<String>> avaiableDocuments() async{
List<String> ids = [];
final QuerySnapshot snapshot = await Firestore.instance.collection('admin').getDocuments();
snapshot.documents.forEach((element) {
ids.add(element.documentID);
});
return ids;
}
- 为什么允许我从一个说它返回未来的函数返回一个列表?
- 当我尝试在屏幕类中消费未来时,同样的事情发生了。列表仅在重启后热重载时出现。
注意:我觉得这是一个简单的问题,但对于异步 voodoo,我几乎是个菜鸟。
应该显示文档 ID 列表的类
import 'package:flutter/material.dart';
import 'package:hisab/database/firestore_api.dart';
class PreviousCarts extends StatefulWidget {
const PreviousCarts({Key key}) : super(key: key);
@override
_PreviousCartsState createState() => _PreviousCartsState();
}
class _PreviousCartsState extends State<PreviousCarts> {
List<String> documentIds = [];
@override
void initState() {
super.initState();
Future<List<String>> f = FirestoreAPI.avaiableDocuments();
f.then((value) {
value.forEach((element) {
documentIds.add(element);
});
});
}
@override
Widget build(BuildContext context) {
print(documentIds);
return Material(
child: Padding(
padding: const EdgeInsets.only(left: 8.0, top: 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: documentIds.map((e) {
return Card(child: ListTile(title: Text(e)));
}).toList(),
),
),
);
}
}
【问题讨论】:
标签: firebase flutter google-cloud-firestore async-await