Flutter 颤振方法在触发另一种方法之前完成
我目前有一个方法getReviewLength(),它将从firestore中获取“收藏”列表中每个项目的评论长度。但是,在将长度添加到ReviewLength列表之前,该方法已经触发loadingComplete()方法。有没有办法确保getReviewLength()方法在触发loadingComplete()之前完成 我尝试过async/await,但我似乎无法让它工作,因为我不确定放在哪里Flutter 颤振方法在触发另一种方法之前完成,flutter,dart,Flutter,Dart,我目前有一个方法getReviewLength(),它将从firestore中获取“收藏”列表中每个项目的评论长度。但是,在将长度添加到ReviewLength列表之前,该方法已经触发loadingComplete()方法。有没有办法确保getReviewLength()方法在触发loadingComplete()之前完成 我尝试过async/await,但我似乎无法让它工作,因为我不确定放在哪里 getReviewsLength() { _favourites.forEach((sho
getReviewsLength() {
_favourites.forEach((shopname) {
firestore.collection('shops').doc(shopname['shopName']).collection('reviews').get()
.then((value) {
setState(() {
int length = value.size;
reviewsLength.add(length);
});
});
});
loadingComplete();
}
loadingComplete(){
setState(() {
loading = false;
});
print(reviewsLength);
}
wait
允许您控制执行顺序并适合您的特定场景:
Future<void> getReviewsLength() async {
Future.forEach(_favourites, (shopname) async {
dynamic value = await firestore.collection('shops').doc(shopname['shopName']).collection('reviews').get();
setState(() {
int length = value.size;
reviewsLength.add(length);
});
});
loadingComplete();
return;
}
void loadingComplete() {
setState(() {
loading = false;
});
print(reviewsLength);
}
Future getReviewLength()异步{
Future.forEach(_favorites,(shopname)异步{
动态值=wait firestore.collection('shops').doc(shopname['shopname'])。collection('reviews').get();
设置状态(){
int length=value.size;
ReviewLength.add(长度);
});
});
加载完成();
返回;
}
无效加载完成(){
设置状态(){
加载=假;
});
打印(Reviews长度);
}
是的,使您异步将在这里有所帮助
要使函数异步,需要在函数中使用关键字async
介于()
和{}
之间,并在运行代码的地方使用wait
关键字
getReviewsLength() async {
_favourites.forEach((shopname) {
await firestore.collection('shops').doc(shopname['shopName']).collection('reviews').get()
.then((value) {
setState(() {
int length = value.size;
reviewsLength.add(length);
});
});
});
loadingComplete();
}
loadingComplete(){
setState(() {
loading = false;
});
print(reviewsLength);
}
我不知道上面的代码是否有效,因为我不确定firestore,但一个基本的例子是
function() async {
await print('hello');
print('world');
}
在这里,应用程序在打印hello
之前不会打印world
,显然这里没有使用异步函数,但在API请求的情况下,它可以使用,在您的情况下也是如此
因此,您需要做的是在发出请求的正确位置使用wait
关键字或将其添加到reviewsLength
问候,
Roshan正如@smac89所提到的,我改为一个for循环,它可以工作
Future<void> getReviewsLength() async {
for (var shopname in _favourites) {
dynamic snapshot = await firestore.collection('shops').doc(shopname['shopName']).collection('reviews').get();
setState(() {
int length = snapshot.size;//value.size;
reviewsLength.add(length);
});
}
loadingComplete();
return;
}
void loadingComplete(){
setState(() {
loading = false;
});
print(reviewsLength);
}
Future getReviewLength()异步{
对于(var shopname in_Favorites){
动态快照=等待firestore.collection('shops').doc(shopname['shopname'])。collection('reviews').get();
设置状态(){
int length=snapshot.size;//value.size;
ReviewLength.add(长度);
});
}
加载完成();
返回;
}
无效加载完成(){
设置状态(){
加载=假;
});
打印(Reviews长度);
}
getReviewLength()
需要异步。您需要删除forEach
并使用常规循环,然后等待调用firestore.collection(…)
谢谢@smac89。for循环工作!forEach以异步的方式进行思考。OP需要使用regular for Loop你好,谢谢你的帮助。但是,它仍然打印一个空列表。I/flatter(13575):[]代码已被更正,以解决@smac89提到的关于循环工作的问题!谢谢