如何查询并展示当前登录用户的Firebase数据(附Flutter代码)
解决只展示当前登录用户Firestore数据的问题
你的当前代码会拉取users集合下的所有用户数据,要实现只展示当前登录用户的专属数据,需要结合Firebase Auth获取用户ID,再对Firestore查询做过滤,具体操作如下:
1. 获取当前登录用户ID
先确保项目已集成Firebase Auth,通过FirebaseAuth.instance.currentUser可获取当前登录用户实例,从中提取唯一标识uid。
2. 修改Firestore查询逻辑
把原本拉取整个集合的查询,改成用uid过滤出当前用户的文档。如果users集合是用用户uid作为文档ID存储的,直接用doc(uid)获取单文档效率更高;如果文档是随机ID但包含uid字段,就用where条件过滤。
3. 调整UI渲染逻辑
因为查询结果是单个用户文档,无需使用ListView.builder,直接读取文档字段即可。
修改后的完整代码
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_firestore/firebase_firestore.dart'; import 'package:flutter/material.dart'; class AddStore extends StatelessWidget { AddStore({Key? key}) : super(key: key); final CollectionReference _users = FirebaseFirestore.instance.collection("users"); final FirebaseAuth _auth = FirebaseAuth.instance; @override Widget build(BuildContext context) { // 获取当前登录用户的uid final String? currentUserId = _auth.currentUser?.uid; // 用户未登录时展示提示 if (currentUserId == null) { return const Scaffold( body: Center(child: Text("请先登录")), ); } return Scaffold( body: StreamBuilder<DocumentSnapshot>( // 方式1:文档ID就是uid(推荐) stream: _users.doc(currentUserId).snapshots(), // 方式2:文档含uid字段,用where过滤 // stream: _users.where("uid", isEqualTo: currentUserId).snapshots(), builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const SizedBox( height: 250, child: Center(child: CircularProgressIndicator()), ); } if (!snapshot.hasData || !snapshot.data!.exists) { return const Center(child: Text("未找到用户数据")); } // 解析用户数据 final userData = snapshot.data!.data() as Map<String, dynamic>; return Center( child: Text(userData['fullName'] ?? "无用户名"), ); }, ), ); } }
关键补充
- 数据安全配置:要确保Firestore安全规则限制用户只能访问自己的文档,示例规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } } - 空值处理:代码中增加了未登录、无数据的兜底提示,避免空指针异常。
内容的提问来源于stack exchange,提问作者Jabu
相关产品推荐
相关产品推荐

