You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Bloc问题:如何等待异步仓库请求完成后再执行

问题解决:等待所有异步请求完成后再执行后续逻辑

你的代码核心问题有三个:

  1. forEach不支持异步等待,内部的async回调不会阻塞外层函数,导致getBids提前返回空的bids列表
  2. 重复调用await getBids()却未将结果赋值给变量,属于无效操作
  3. 创建BidsLoadedState后未调用emit发送状态

修改后的代码如下:

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

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

      final bids = await Future.wait(
        item.bids?.map((bidId) async {
              final bid = await firestoreRepository.getBidByBidId(bidID: bidId);
              if (bid == null) return null;
              
              final dbUser = await firestoreRepository.getDBUserByDBUserId(
                dbUserID: bid.bidderID,
              );
              if (dbUser == null) return null;

              bid.userName = dbUser.userName;
              return bid;
            }) ?? [],
      );

      // 过滤掉null值,得到有效bid列表
      final validBids = bids.whereType<Bid>().toList();
      // 按时间戳排序
      validBids.sort((a, b) => a.timestamp.compareTo(b.timestamp));
      // 发送加载完成状态
      emit(BidsLoadedState(validBids));
    });
  }
}

关键改动说明:

  • 用map将每个bidId转换为异步任务,替代无法等待的forEach
  • 通过Future.wait批量等待所有异步任务完成,确保所有Bid和用户数据都获取完毕
  • 用whereType<Bid>()过滤掉所有null结果,得到有效数据列表
  • 移除无效的重复调用,补上emit发送状态的逻辑

内容的提问来源于stack exchange,提问作者muismat333

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:15:36