Flutter中Firestore流处理时Map<UserModel?, double>返回空集合求助
解决Firestore流中异步forEach导致Map为空的问题
问题核心在于forEach不会等待异步回调完成。你在forEach的异步回调里执行await getUserData(key),但forEach本身不会阻塞等待这些异步操作结束,所以当外部执行print(friendObjectList)和返回Map时,里面的异步请求还没完成,Map自然是空的。
修复后的代码
Stream<Map<UserModel?, double>> getFriendStream() { return firestore .collection('users') .doc(auth.currentUser?.phoneNumber) .snapshots() .asyncMap((event) async { final friendObjectList = <UserModel?, double>{}; if (event.data() != null) { final user = UserModel.fromMap(event.data()!); // 将每个好友的异步查询任务转为Future列表 final futures = user.friendList.entries.map((entry) async { final doc = await getUserData(entry.key); friendObjectList[doc] = entry.value; }); // 等待所有异步任务执行完毕 await Future.wait(futures); } print(friendObjectList); // 此时Map已被正确填充 return friendObjectList; }); }
关键修改说明
- 给
asyncMap的回调函数加上async关键字,支持内部使用await - 用
user.friendList.entries.map替代forEach,将每个键值对的异步操作转为Future集合 - 通过
await Future.wait(futures)等待所有异步查询完成,确保Map填充完毕后再执行后续逻辑 - 用Dart推荐的集合字面量
<UserModel?, double>{}替代new Map(),代码更简洁
内容的提问来源于stack exchange,提问作者YatharthDixit
相关产品推荐
相关产品推荐

