我正在尝试从Firestore检索文档ID的列表。 我的firestore函数作为静态方法存储在我创建的FirebaseAPI类中。
这是应该返回documentId列表的函数:
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;
}
注意:我觉得这是一个简单的问题,但是对于异步伏都教,我几乎是个菜鸟。
应显示文档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(),
),
),
);
}
}
答案 0 :(得分:0)
我不能仅从此功能获得列表吗?
不。由于数据库查询是异步的,因此涉及它的所有内容也必须是异步的。尝试将异步方法转换为立即返回方法是一个坏主意,因为如果查询速度慢或应用程序处于脱机状态,这将导致您的应用程序冻结。
我建议您在某些情况下阅读本文。 https://medium.com/firebase-developers/why-are-the-firebase-apis-asynchronous-e037a6654a93
如何允许我从一个表示返回未来的函数中返回列表?
因为dart编译器正在确保调用方收到Future。它正在处理与异步/等待有关的幕后难题,使您可以更轻松地编写代码,这样就不必在期货出现时就对其进行明确说明。
这种异步编程风格非常普遍,并以其他语言(例如JavaScript)出现。如果您想有效使用dart和一般的异步编程,那么建议您花些时间来熟悉这些技术。这需要练习。