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

Flutter+Firestore最新版如何仅获取当前用户数据?

Flutter + 新版Firestore 仅获取特定用户数据问题

我正尝试用Flutter结合最新版Firestore获取当前用户的专属数据,但网上旧方法因Firebase更新失效了。以下是我的StreamBuilder代码:

final currentUser = FirebaseAuth.instance.currentUser;
//Streams are used to listen to realtime streams of data

@override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _usersStream,
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) {
          return Text('Something went wrong');
        }
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text("Loading");
        }
        return ListView(
          children: snapshot.data!.docs.map((DocumentSnapshot document) {
            Map<String, dynamic> data =
                document.data()! as Map<String, dynamic>;
            return Row(
              children: [
                Text(data['first name']),
                Text(data['last name']),
              ],
            );
          }).toList(),
        );
      },
    );
  }

我想用uid查询当前用户的全部数据,试了两种流查询都没用:

第一种写法:

final Stream<QuerySnapshot> _myUserStream = FirebaseFirestore.instance.collection('users').doc(currentUser!.uid).snapshots();

第二种写法:

final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance.collection('users').where('email', currentUser.email).snapshots();

问题原因与解决方法

错误1:流类型不匹配

doc(currentUser!.uid).snapshots()返回的是单个文档的流(Stream<DocumentSnapshot>),但你声明的变量类型是Stream<QuerySnapshot>,类型不匹配导致无法正常工作。

正确写法(推荐,直接通过文档ID获取,效率更高):

final currentUser = FirebaseAuth.instance.currentUser;

// 修正流的类型为Stream<DocumentSnapshot>
final Stream<DocumentSnapshot> _myUserStream = FirebaseFirestore.instance
    .collection('users')
    .doc(currentUser?.uid)
    .snapshots();

@override
Widget build(BuildContext context) {
  // 同步修改StreamBuilder的泛型为DocumentSnapshot
  return StreamBuilder<DocumentSnapshot>(
    stream: _myUserStream,
    builder: (context, snapshot) {
      if (snapshot.hasError) {
        return const Text('出错了');
      }
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Text('加载中');
      }
      // 检查文档是否存在
      if (!snapshot.hasData || !snapshot.data!.exists) {
        return const Text('用户数据不存在');
      }
      // 解析单文档数据
      Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>;
      return Row(
        children: [
          Text(data['first name'] ?? ''),
          Text(data['last name'] ?? ''),
        ],
      );
    },
  );
}

错误2:where方法参数格式错误

新版Firestore的where方法需要明确指定比较操作符(比如isEqualTo),不能直接传值。

正确写法(适用于文档ID不是uid,而是文档内存储了uid/email字段的场景):

final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance
    .collection('users')
    // 使用isEqualTo指定匹配规则
    .where('email', isEqualTo: currentUser?.email)
    .snapshots();

如果是通过uid字段查询,写法类似:

final Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance
    .collection('users')
    .where('uid', isEqualTo: currentUser?.uid)
    .snapshots();

此时原有的StreamBuilder(泛型为QuerySnapshot)可以正常使用,因为where返回的是查询快照流,只是注意因为uid/email唯一,结果列表只会有一个文档。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:55:31