Flutter Bloc问题:如何等待异步仓库请求完成后再执行
问题解决:等待所有异步请求完成后再执行后续逻辑
你的代码核心问题有三个:
forEach不支持异步等待,内部的async回调不会阻塞外层函数,导致getBids提前返回空的bids列表- 重复调用
await getBids()却未将结果赋值给变量,属于无效操作 - 创建
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
相关产品推荐
相关产品推荐

