Flutter Firestore如何判断用户文档存在及修正页面跳转异常问题
问题根因
- 文档ID硬编码错误:你代码中
.doc('uid')写死了要查询的文档ID为字符串uid,没有读取当前已登录用户的真实ID,首先需要通过FirebaseAuth获取身份验证后返回的用户uid。 - 快照判断逻辑错误:
snapshot.hasData仅代表已接收到Firestore的响应结果,就算目标文档不存在,也会返回一个有效的DocumentSnapshot对象,所以只要请求完成就会触发跳转到UserHomeScreen,和文档是否存在没有关联。
修复后的代码
import 'package:firebase_auth/firebase_auth.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; class UserStream extends StatelessWidget { const UserStream({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // 获取当前身份验证通过的用户uid final String? currentUid = FirebaseAuth.instance.currentUser?.uid; // 无有效登录用户直接进入注册流程 if (currentUid == null) { return const SignUpNewUser(); } return StreamBuilder<DocumentSnapshot>( // 传入真实用户uid作为查询的文档ID stream: FirebaseFirestore.instance.collection('users').doc(currentUid).snapshots(), builder: (context, snapshot) { // 请求出错时返回注册页,可根据需求替换为错误提示UI if (snapshot.hasError) { return const SignUpNewUser(); } // 加载状态展示加载指示器,避免加载过程中逻辑误判 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 核心判断:仅当返回数据存在且对应文档真实存在时,才进入用户主页 if (snapshot.hasData && snapshot.data!.exists) { return const UserHomeScreen(); } else { return const SignUpNewUser(); } }, ); } }
逻辑补充说明
- 额外增加了加载状态和错误状态的处理,避免请求过程中出现空白页面或者逻辑跳转异常
- 核心判断条件用
DocumentSnapshot.exists字段判断文档是否真实存在,只有存在的情况才会跳转到用户主页 - 增加了登录用户有效性校验,避免无登录用户时的异常请求
内容的提问来源于stack exchange,提问作者DB Cooper
相关产品推荐
相关产品推荐

