我有以下代码:
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);
});
}
}
我的bids.sort((a, b) => a.timestamp.compareTo(b.timestamp));
在我从存储库检索我的项目之前被触发。因此,BidsLoadedState
也会被空出价所推动…
我怎样才能使我的代码在转到下一行之前等待?
谢谢你,
你不能使用forEach
对async
操作,因为它的回调是VoidCallback
而不是AsyncCallback
,所以它不能返回任何值
Effective Dart建议使用for
循环代替:
for (final element in item.bids) {
final bid = await firestoreRepository.getBidByBidId(bidID: element);
}
试试这个:
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;
}
}