我有此代码,该代码应返回userId。问题是,由于用户已注销,它返回null。
@override
void initState() {
// TODO: implement initState
super.initState();
try {
widget.auth.currentUser().then((userId) {
setState(() {
authStatus = userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
});
});
} catch (e) {}
}
即使在将catch包缠起来之后,这仍然会引发错误。错误冻结了我的应用 错误:
Exception has occurred.
NoSuchMethodError: The getter 'uid' was called on null.
Receiver: null
Tried calling: uid
尝试调用的方法是
Future<String> currentUser() async {
FirebaseUser user = await _firebaseAuth.currentUser();
return user.uid;
}
答案 0 :(得分:3)
尝试一下:
widget.auth.currentUser().then((userId) {
setState(() {
authStatus = userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
});
}).catchError((onError){
authStatus = AuthStatus.notSignedIn;
});
更新 如果firebaseAuth返回null,则不能使用用户的uid属性,因为它为null。
Future<String> currentUser() async {
FirebaseUser user = await _firebaseAuth.currentUser();
return user != null ? user.uid : null;
}
答案 1 :(得分:2)
好像您在看Andrea Bizzotto的登录播放列表,对吗?
我也通过了它。我设法解决错误的方法是更改auth.currentUser()
声明的位置。您可能已经在Auth auth
内创建了StatelessWidget
。
尝试将Auth
的实例从StatelessWidget
移到State
,正好在void initState()
之前。
并替换您的代码,以便您可以从Auth
访问State
。像这样:
@override
void initState() {
// TODO: implement initState
super.initState();
try {
auth.currentUser().then((userId) { //I've removed the 'widget.'
setState(() {
authStatus =
userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
});
});
} catch (e) {}
}
完成此操作后,您的代码不应再抛出此错误。
答案 2 :(得分:0)
FirebaseUser _user;
@override
void initState() {
super.initState();
_checkUser();
}
@override
Widget build(BuildContext context) {
if (_user == null) {
return AuthStatus.notSignedIn;
} else {
return AuthStatus.signedIn;
}
}
Future<void> _checkUser() async {
_user = await FirebaseAuth.instance.currentUser();
setState(() {});
}