Flutter按Firestore中userType跳转登录后页面出现报错如何修复?
问题修复方案
错误根源
FirebaseAuth.instance.authStateChanges()返回的流仅包含Firebase身份认证的User基础数据,仅存储uid、邮箱等认证相关信息,不包含你存放在Firestore数据库中的自定义userType字段,你直接对认证用户对象调用['userType']取值属于类型不匹配的非法操作,因此触发报错。
修复思路
拿到认证用户的uid后,再请求Firestore中对应uid的用户文档,从中读取userType字段再做跳转判断,完整修复代码如下:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; // 你的页面导入省略 // import 'xxx.dart' Widget build(BuildContext context) { return StreamBuilder( stream: FirebaseAuth.instance.authStateChanges(), builder: (context, authSnapshot) { // 未登录状态直接返回认证页 if (!authSnapshot.hasData) { return const AuthScreen(); } // 已获取到认证用户,取出uid final String userId = authSnapshot.data!.uid; // 嵌套StreamBuilder监听Firestore相应用户文档的实时变化 return StreamBuilder( stream: FirebaseFirestore.instance.collection('users').doc(userId).snapshots(), builder: (context, userDocSnapshot) { // 数据加载中展示加载态 if (userDocSnapshot.connectionState == ConnectionState.waiting) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } // 读取用户数据中的userType字段 final Map<String, dynamic>? userInfo = userDocSnapshot.data?.data(); final String? userType = userInfo?['userType']; // 根据用户类型跳转对应页面 if (userType == 'Confinement Lady') { return const CLLadyMainScreen(); } else if (userType == 'Customer') { return const CustomerMainScreen(); } // 异常情况返回认证页 return const AuthScreen(); }, ); }, ); }
额外注意
- 请确保你的项目已经正确引入
cloud_firestore依赖,且Firestore中users集合的文档id和认证用户的uid完全一一对应 - 加载态的样式可根据你的产品需求自行调整,避免用户等待时出现白屏
内容的提问来源于stack exchange,提问作者kiku
相关产品推荐
相关产品推荐

