我正在尝试实现一个Home类,该类显示新用户的登录屏幕或以前登录的用户的自动登录,并将其直接带到应用程序中。但是,在代码运行时,它会显示登录用户的登录屏幕。
据我了解,即使Future以后返回当前User,Future函数最初返回的是空值,并且代码仍以显示“登录页面”结尾。
class Home extends StatelessWidget {
FirebaseAuth _auth = FirebaseAuth.instance;
Future<FirebaseUser> getCurrentUser() async {
return _auth.currentUser();
}
Widget userLoggedIn() {
getCurrentUser().then((user) {
if (user != null) {
//User is auto-logged in = build main app
return new Scaffold(
body: Center(
child: Text("Main App"),
),
);
} else if (user == null) {
//New user = return null
return null;
});
}
@override
Widget build(BuildContext context) {
return userLoggedIn() ??
//New user = build login page
new Scaffold(
body: Center(
child: Text("Login Page"),
),
);
}
}
您能帮我解决这个问题吗?
答案 0 :(得分:0)
您需要等待,直到_auth.currentUser()
返回用户。
使用await
关键字,而不使用.then()
。
更改您的getCurrentUser()
方法。
返回FirebaseUser
而不是Future
。
FirebaseUser currentUser = await authService.getCurrentUser();
答案 1 :(得分:0)
您可以在LoginPage
的{{1}}中开始自动登录进度,
initState
必须为LoginPage
才能使用StatefulWidget
initState
使用该方法退出:
@override
void initState() {
FirebaseAuth.instance.currentUser().then((user) {
if (user != null) { //if there isn't any user currentUser function returns a null so we should check this case.
Navigator.pushAndRemoveUntil(
// we are making YourHomePage widget the root if there is a user.
context,
MaterialPageRoute(builder: (context) => YourHomePage()),
(Route<dynamic> route) => false);
}
});
super.initState();
}