目标
我正在尝试在我的flutter应用程序屏幕上显示当前登录用户的姓名。如果当前没有用户从该设备登录,则会出现空白。此名称存储在一个名为userName
的String变量中。此外,如果用户已登录,则布尔isSignedIn
变量将设置为true,否则为false。
我的代码:
在firebase_auth_methods.dart文件中,我有以下代码:
final FirebaseAuth _auth;
//STATE PERSISTANCE
Stream<User?> get authState => FirebaseAuth.instance.authStateChanges();
//GET USER
User get user => _auth.currentUser!;
在我的account_screen.dart文件中,我在Widget build((中有以下代码:
final currUser = context.read<FirebaseAuthMethods>().user;
print(currUser);
if (!currUser.isAnonymous && currUser.phoneNumber == null) {
userName = currUser.email!;
isSignedIn = true;
}
if (currUser.phoneNumber != null) {
userName = currUser.phoneNumber!;
isSignedIn = true;
}
if (currUser.isAnonymous) {
isSignedIn = true;
}
if (currUser == null) {
userName = "Guest";
isSignedIn = false;
}
面临的问题:
但是,我无法检查currUser
的可能空值,因为我收到警告:操作数不能为空,因此条件始终为false。请尝试删除条件、封闭条件或整个条件语句
当没有用户从此模拟器AVD/设备登录时,导航到account_screen将返回空值错误使用空检查运算符。
我似乎理解为什么会出现这个错误,但不知道如何对currUser
的null值执行所需的验证检查。这是我第一次尝试Firebase身份验证,所以请帮我解决这个问题。
删除'!'来自getter的符号:
User? get user => _auth.currentUser!; <--- here, and make the return type nullable.
现在,当你阅读用户时:
final currUser = context.read<FirebaseAuthMethods>().user;
它将可以为null
您得到错误是因为您使用!强制用户不可为null!。
在您的user类中,如果user为空或非空,请为bool创建一个getter。
class User {
final String id;
final String? email;
final String? name;
final String? photo;
static const empty = User(id: '');
bool get isEmpty => this == User.empty;
bool get isNotEmpty => this != User.empty;
const User({
required this.id,
this.name,
this.email,
this.photo
});
}
这里的逻辑是,如果用户id或uid为空或等于''
,则不存在用户
你可以这样使用它:
final currUser = context.read<FirebaseAuthMethods>().user;
if (currUser.isEmpty) {
userName = "Guest";
isSignedIn = false;
}