Flutter Bloc await for response before continueing

I have following code:

class BidBloc extends Bloc<BidEvent, BidState> {
  final FirestoreRepository firestoreRepository;

  BidBloc({required this.firestoreRepository}) : super(BidsLoadingState()) {
    on<LoadAllBidsEvent>((event, emit) async {
      Item item = event.item;

      Future getBids() async {
        List<Bid> bids = [];

        item.bids?.forEach((element) async {
          Bid? bid = await firestoreRepository.getBidByBidId(bidID: element);
          if (bid != null) {
            DbUser? dbUser = await firestoreRepository.getDBUserByDBUserId(
                dbUserID: bid.bidderID);
            if (dbUser != null) {
              bid.userName = dbUser.userName;
        return bids;

      List<Bid> bids = await getBids();

      await getBids();

      bids.sort((a, b) => a.timestamp.compareTo(b.timestamp));

My bids.sort((a, b) => a.timestamp.compareTo(b.timestamp)); gets triggered before i retreive my itemss from my repository. Therefor the BidsLoadedState gets pushed with empty bids also…

How can I make my code wait before going to the next line?

Thank you,

>Solution :

You must not use forEach for async operations because its callback is a VoidCallback and not an AsyncCallback so it cannot return any value.

Effective Dart propose to use for loops instead:

for (final element in item.bids) {
  final bid = await firestoreRepository.getBidByBidId(bidID: element);

Leave a Reply