Flutter 颤振方法在触发另一种方法之前完成

Flutter 颤振方法在触发另一种方法之前完成,flutter,dart,Flutter,Dart,我目前有一个方法getReviewLength(),它将从firestore中获取“收藏”列表中每个项目的评论长度。但是,在将长度添加到ReviewLength列表之前,该方法已经触发loadingComplete()方法。有没有办法确保getReviewLength()方法在触发loadingComplete()之前完成 我尝试过async/await,但我似乎无法让它工作,因为我不确定放在哪里 getReviewsLength() { _favourites.forEach((sho

我目前有一个方法getReviewLength(),它将从firestore中获取“收藏”列表中每个项目的评论长度。但是,在将长度添加到ReviewLength列表之前,该方法已经触发loadingComplete()方法。有没有办法确保getReviewLength()方法在触发loadingComplete()之前完成

我尝试过async/await,但我似乎无法让它工作,因为我不确定放在哪里

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提到的关于循环工作的问题!谢谢