等待函数在ListView中完成



由于Firestore请求,我需要等待函数在ListView中完成。我尝试使用Future.wait((,但它不起作用。

FutureBuilder<QuerySnapshot>(
future: FirebaseFirestore.instance
.collection('Statements')
.where('userID',isEqualTo: context.watch<User>().uid)
.get(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
if (snapshot.hasError) {return Text("Erreur");}
if (snapshot.connectionState == ConnectionState.waiting) {
return Text("Loading");}
return Expanded(
child:ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index) {
DocumentSnapshot document = snapshot.data.docs[index];
Future.wait([getStatementData(document)]);
return StatementCard(statement:selectedStatement,
accommodation : relatedAccommodation,
owner : relatedOwner);
},
)

这是一个名为的函数

Future getStatementData(document)  async {
selectedStatement = Statement.fromFirebase(document);
document.data()["accommodation"].get().then((value) {
relatedAccommodation = Accommodation.fromFirebase(value);});
await FirebaseFirestore.instance
.collection('Owners')
.doc(document["ownerList"][0])
.get().then((value) {
print(value.data());
relatedOwner = Owner.fromFirebase(value);
});
}

我应该使用另一个未来的建设者吗?

您应该这样做,在里面返回另一个Future Builder:

ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index) {
DocumentSnapshot document = snapshot.data.docs[index];
return  FutureBuilder(
future: getStatementData(document) ,
builder: (context, snapshot) {
return snapshot.connectionState == ConnectionState.done
? StatementCard(statement:selectedStatement,
accommodation : relatedAccommodation,
owner : relatedOwner);
: Container(); 
);
},
)

我想你只是错过了一件简单的事情,FutureBuilder也有一个connectionstate.done状态,你可以访问它。这将等待,直到您的未来功能完成。

return FutureBuilder(
future: yourFunction,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Center(child: Text('No status',);
break;
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
break;
case ConnectionState.done:
return Text('Im done!') // Your listviewbuilder comes here
break;
default:
}
}, 
),

文件:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html带有ListViewBuilder的FutureBuilder示例:https://medium.com/nonstopio/flutter-future-builder-with-list-view-builder-d7212314e8c9

[…]connectionState.done=[future]不是null,并且已完成。如果未来成功完成,[AncSnapshot.data]将被设置为未来完成的值。如果完成时出现错误,则[AncSnapshot.hasError]将为true,并且[AncSnap快照.error]将设置为错误对象。[…]

最新更新