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

Flutter从Firebase获取自动更新流报错:返回类型不匹配求助

解决Firebase流返回类型不匹配的问题

你的问题出在变量类型声明错误和不必要的async*使用上,以下是具体修正方案:

错误根源

你把users变量声明为Stream<QuerySnapshot<User?>>,但经过map(将查询快照转为List<User>)和expand(将列表展开为单个User的流)后,实际得到的是Stream<User>,类型不匹配直接触发了报错。另外,函数用了async*却没有yield语句,完全没必要用生成器语法。

修正后的代码(简洁版)

直接返回处理后的流即可:

Stream<User> getUsers(String storeLocation) {
  return _firestore
      .collection(firebase_constants.kUsersCollection)
      .where('storeLocation', isEqualTo: storeLocation)
      .snapshots()
      .map((querySnapshot) {
        return querySnapshot.docs.map((doc) {
          return User.fromJson(doc.data()! as Map<String, dynamic>);
        }).toList();
      })
      .expand((users) => users);
}

若坚持使用async*生成器

可以通过yield*转发流:

Stream<User> getUsers(String storeLocation) async* {
  final Stream<User> usersStream = _firestore
      .collection(firebase_constants.kUsersCollection)
      .where('storeLocation', isEqualTo: storeLocation)
      .snapshots()
      .map((querySnapshot) {
        return querySnapshot.docs.map((doc) {
          return User.fromJson(doc.data()! as Map<String, dynamic>);
        }).toList();
      })
      .expand((users) => users);
  
  yield* usersStream;
}

额外优化建议

给collection指定泛型,避免后续类型强制转换:

.collection<User>(firebase_constants.kUsersCollection)

这样doc.data()直接返回User?,可以简化fromJson的调用逻辑(需根据User类的实际情况处理null场景)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:27:11