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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:04