我希望将来自Firestore的数据存储到一个列表中,该列表将包含其所有文档中的数据。
我将列表定义为:
List retrievedData = List();
接下来,按下按钮,我想在特定集合的所有文档中打印数据。所以,我这样做了:
RaisedButton(
onPressed: () async {
var collectionReferece = await Firestore.instance.collection('insults');
collectionReferece.getDocuments().then((collectionSnapshot){
retrievedData = collectionSnapshot.documents.toList();
});
print(retrievedData);
},
我希望在控制台中看到它:
I/flutter (11351): [{index: 200, title: This is a test 1},{index: 100, title: This is a test 2}]
但是我明白了:
I/flutter (11351): [Instance of 'DocumentSnapshot', Instance of 'DocumentSnapshot']
此外,我只想将此数据存储在列表或任何其他变量中。帮帮我。谢谢。
编辑:
我尝试使用forEach
,但每次按下按钮时它都会继续增加。
答案 0 :(得分:2)
如果要:
然后您可以执行以下操作,首先在State
类下声明以下变量:
class _MyHomePageState extends State<MyHomePage> {
bool isFirstTime = false;
List<DocumentSnapshot> datas = List<DocumentSnapshot>();
接下来,创建一个名为getData()
的方法,该方法将在onPressed
中引用:
floatingActionButton: FloatingActionButton(
onPressed: getData,
tooltip: 'Increment',
child: Icon(Icons.add),
),
getData() async {
if (!isFirstTime) {
QuerySnapshot snap =
await Firestore.instance.collection("insults").getDocuments();
isFirstTime = true;
setState(() {
datas.addAll(snap.documents);
});
}
}
按一下FAB,您将在insults
集合中获取数据。我们使用布尔值每次点击仅检索一次。在您要覆盖的方法dispose
中:
@override
void dispose() {
super.dispose();
this.isFirstTime = false;
}
}
您可以再次将isFirstTime
分配给false
。然后要显示数据,可以使用body
的属性AppBar
,将其分配给Center
小部件,而Center
小部件将包含listview
:
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: ListView.builder(
itemCount: datas.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('${datas[index]["index"]}'),
subtitle: Text('${datas[index]["title"]}'),
);
},
),
使用listview.builder
,您将在屏幕上看到一个列表,而不必使用forEach
来迭代一个列表。您只需使用get
运算符[]
就能获取列表中的数据。
答案 1 :(得分:1)
任何需要访问Firestore数据的代码都必须位于then
内部。所以:
var collectionReferece = await Firestore.instance.collection('insults');
collectionReferece.getDocuments().then((collectionSnapshot){
retrievedData = collectionSnapshot.documents.toList();
print(retrievedData);
});
但是,您通常希望将数据加载与build()
方法分开,并使用state或FutureBuilder
将数据库中的数据获取到呈现的输出中。一些例子:
FutureBuilder
答案 2 :(得分:0)
我认为这是因为.toList()方法将这两个文档放在与List中“ DocumentSnapshot”相同的数据类型上。尝试打印以确保结果。
print(retrievedData[0]['title']);