Flutter集成FirebaseAuth出现User类无user getter及uid空访问报错如何解决
报错修复方案
错误根源说明
- 前2个报错:混淆了
User类与UserCredential实例的属性访问,signInWithEmailAndPassword、createUserWithEmailAndPassword返回的是UserCredential类型对象,原代码中把该实例命名为user,要访问该实例下的user属性才能拿到Firebase用户对象,而不是直接访问User类的静态属性User.user(该属性根本不存在)。 - 第3个报错:Firebase SDK适配Dart空安全,
UserCredential的user属性为可空类型User?,调用登录/注册接口成功时该属性一定非空,所以需要添加非空断言!来明确告知编译器该值不会为空。
修正后完整代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; class _AuthService { final FirebaseAuth _auth = FirebaseAuth.instance; final FirebaseFirestore _firestore = FirebaseFirestore.instance; // 登录 Future<User> signIn(String email, String password) async { UserCredential userCredential = await _auth.signInWithEmailAndPassword( email: email, password: password); return userCredential.user!; } // 登出 Future<void> signOut() async { return await _auth.signOut(); } // 注册 Future<User> createPerson(String name, String lastname, String telephoneNumber, String email, String password) async { UserCredential userCredential = await _auth.createUserWithEmailAndPassword( email: email, password: password); // 加非空断言访问uid await _firestore.collection('Person').doc(userCredential.user!.uid).set({ 'name': name, 'lastname': lastname, 'telephone': telephoneNumber, 'email': email, }); return userCredential.user!; } }
核心修改点
- 把原来接收返回值的
var user重命名为UserCredential userCredential,避免类型混淆,提升代码可读性 - 登录、注册方法的返回值从错误的
User.user改为userCredential.user!,解决User类无user getter的报错 - 写入Firestore时访问uid的代码从
user.user.uid改为userCredential.user!.uid,解决空安全报错 - 补充了
signOut方法的返回值类型Future<void>,规范代码写法
内容的提问来源于stack exchange,提问作者Mona Roza
相关产品推荐
相关产品推荐

