[英]ListView.seperated displaying Only after a Hot Reload
I have called the getRecords function in initState
.我在 initState 中调用了 getRecords initState
。 The listview only displays after I hot reload.列表视图仅在我热重载后显示。 I tried putting it under setState
, but it didn't help.我试着把它放在setState
下,但它没有帮助。
void getRecords() async {
final records =
await Firestore.instance.collection('records').getDocuments();
for (var record in records.documents) {
if (record.data['email'] == newEmail) {
int len = record.data['requestEmail'].length;
for (int i = 0; i < len; i++) {
if(record.data['requestEmail'][i] != newEmail){
names.add(record.data['requestName'][i]);
emails.add(record.data['requestEmail'][i]);
}
else
continue;
}
}
}
print(names);
body: ListView.separated(
padding: const EdgeInsets.all(8),
itemCount: names.length,
itemBuilder: (BuildContext context, int index) {
return Card(
color: Colors.white,
child: ListTile(
onTap: () {},
title: Text('${names[index]}'),
),
);
},
separatorBuilder: (BuildContext context, int index) => const Divider(),
),
This is happening because getting data from firebase is async task, so it takes time.这是因为从 firebase 获取数据是异步任务,因此需要时间。 Meanwhile build method build the widget without data, so when you get data you have to call setState to build listview with actual data.同时 build 方法在没有数据的情况下构建小部件,因此当您获取数据时,您必须调用 setState 来构建带有实际数据的列表视图。
Moreover, i also like to suggest that you can use futurebuilder or streambuilder when you are working with async.此外,我还建议您在使用 async 时可以使用futurebuilder或streambuilder 。
void getRecords() async {
final records =
await Firestore.instance.collection('records').getDocuments();
for (var record in records.documents) {
if (record.data['email'] == newEmail) {
int len = record.data['requestEmail'].length;
for (int i = 0; i < len; i++) {
if(record.data['requestEmail'][i] != newEmail){
names.add(record.data['requestName'][i]);
emails.add(record.data['requestEmail'][i]);
}
else
continue;
}
}
setState(() {}); // added line
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.