如何在应用程序启动时自动登录Firebase用户?

时间:2019-03-23 17:46:19

标签: firebase flutter firebase-authentication

我正在尝试实现一个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"),
        ),
      );
}

}

您能帮我解决这个问题吗?

2 个答案:

答案 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(); }