在Flutter中检查Firebase身份验证状态

6

目前我需要设置一个检查用户是否登录的功能,然后根据情况采取相应的行动(打开主页或登录屏幕)。我只使用电子邮件进行身份验证。

如何在Flutter中检查用户Firebase身份验证状态?

这个问题已经被问过这里,但我无法通过这种方式检查身份验证状态:

final auth = FirebaseAuth.instance;

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'MyApp',
        home: (_checkLogin() == true ? new PostAuthScaffold() : new PreAuthScaffold())
    );
  }
}

bool _checkLogin() {
  return !(auth.currentUser == null);
}
2个回答

8

您也可以在initState中检查您的认证状态,如下所示:

class CheckAuth extends StatefulWidget {
  @override
  _CheckAuthState createState() => new _CheckAuthState();
}

class _CheckAuthState extends State<CheckAuth> {
  bool isLoggedIn;
  @override
  void initState() {
    isLoggedIn = false;
    FirebaseAuth.instance.currentUser().then((user) => user != null
        ? setState(() {
            isLoggedIn = true;
          })
        : null);
    super.initState();
    // new Future.delayed(const Duration(seconds: 2));
  }

  @override
  Widget build(BuildContext context) {
    return isLoggedIn ? new Home() : new LoginScreen();
  }
}

返回“失败断言:布尔表达式不能为空”错误。我应该尝试在用户登录或注销时手动更改isLoggedIn值并将其存储在共享首选项中吗? - Darkhan
那是因为我忘记初始化数值了,我已经更新了代码。 - Shady Aziza

5

那么

FirebaseAuth.instance.onAuthStateChanged.listen((user) {
  setState(() => isAuthenticated = user != null);
}) 

尝试了这种方法,还加上了“user.email != null”作为预防措施,但似乎并没有起作用——在重新打开应用程序后仍然会返回到登录页面。谢谢。 - Darkhan
从那段代码片段很难说。它可能是正确的,但你应该测试一下上面的代码是否返回了预期的结果。 - Günter Zöchbauer
是的,我能够成功地注册并登录(感谢您对我之前问题的回答),但是如果我在登录后关闭应用程序,然后再次打开它 - 登录屏幕会再次弹出(而不是预期的主屏幕)。 - Darkhan
当登录页面显示时,我的答案中的代码是否会被执行? - Günter Zöchbauer
让我们在聊天中继续这个讨论 - Darkhan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接