muismat333
muismat333

Reputation: 13

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 {
      emit(BidsLoadingState());
      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;
              bids.add(bid);
            }
          }
        });
        return bids;
      }

      List<Bid> bids = await getBids();

      await getBids();

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

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,

Upvotes: 0

Views: 233

Answers (2)

BambinoUA
BambinoUA

Reputation: 7100

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);
}

Upvotes: 2

Xuuan Thuc
Xuuan Thuc

Reputation: 2521

Try this:

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

  BidBloc({required this.firestoreRepository}) : super(BidsLoadingState()) {

    on<LoadAllBidsEvent>(_LoadBirdEvent);
  }
  
  _LoadBirdEvent(
      LoadAllBidsEvent event,
      Emitter<BidState> emit,
      ) async {
    emit(BidsLoadingState());
    Item item = event.item;

    List<Bid> bids = await getBids();

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


  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;
          bids.add(bid);
        }
      }
    });
    return bids;
  }
}

Upvotes: 0

Related Questions