在Flutter和Firebase身份验证中检查用户是否已登录

22
我正在使用 Firebase 认证来验证 Flutter 应用程序中的用户。当用户输入正确密码时,应用程序会正常显示主页,但是当密码错误时不会发生任何事情。我想每次用户输入错误密码时都显示一个警报。如何实现这一功能呢?

检查当前用户是否!= null - Günter Zöchbauer
@GünterZöchbauer 你能写出所有的代码吗? - STEP PLUS
请编写您的代码,以便我们知道您正在使用什么。 - Raouf Rahiche
7个回答

36

使用currentUser()方法:

if (FirebaseAuth.instance.currentUser != null) {
    // signed in
} else {
   // signed out   
}

4
这对我没有效果,可能是因为currentUser返回一个Future,它不是null并且会使应用程序一直认为用户已登录。使用await或.then实际上可以获取用户对象而不是Future。 - pillar15
2
这个答案不正确,FirebaseAuth.instance.currentUser() 在 firebase_auth 插件 0.11.0 中是异步的,也许在过去它是同步的。 - Brian Ogden
4
你可以始终使用if (await FirebaseAuth.instance.currentUser() == null) - Oliver Dixon
2
空安全问题... 错误:无法无条件调用该函数,因为它可能为“null” - genericUser
现在这是一个 getter,所以不需要 ():https://firebase.google.com/docs/auth/flutter/manage-users#get_a_users_profile - Ross Llewallyn

14

对我来说那样做行不通,所以我做了这个:

FirebaseAuth.instance.currentUser().then((firebaseUser){
  if(firebaseUser == null)
   {
     //signed out
   }
   else{
    //signed in
  }
});

8
对我来说没用。即使 Firebase 用户正在被删除,它仍然是有效的。 - Oliver Dixon
3
我遇到了完全相同的问题。你找到了任何解决办法吗? - Haroon khan

5
也许最简短且最安全的答案是:
if(FirebaseAuth.instance.currentUser?.uid == null){
// not logged
} else {
// logged
}

该函数获取已通过应用程序进行身份验证的每个用户在 Firebase 认证 UID 字段上记录的用户 ID(如果存在),否则返回 null。
currentUser?.uid 中的问号是空安全性,以避免空异常(如果为 null,则返回 null)。


3

尝试这个,它对我有效。

从用户获取令牌并刷新它。

Future<bool> isUserLogged() async {
    FirebaseUser firebaseUser = await getLoggedFirebaseUser();
    if (firebaseUser != null) {
        IdTokenResult tokenResult = await firebaseUser.getIdToken(refresh: true);
        return tokenResult.token != null;
    } else {
        return false;
    }
}

Future<FirebaseUser> getLoggedFirebaseUser() {
    return firebaseAuthInstance().currentUser();
}

2
当回答一个旧问题时,如果您包含一些上下文来解释您的答案如何有助于其他StackOverflow用户,那么您的答案将对其他人更有用。请参阅:如何撰写好答案 - David Buck

1
if (FirebaseAuth.instance.currentUser() != null) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        home: Home(),
    );
} else {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        home: Welcome(),
    );
}

3
请勿将代码作为单独的答案,尝试解释它是如何解决问题的。 - Krzysztof Madej

0
在你的初始化方法中执行以下操作...
 FirebaseAuth.instance.currentUser().then((firebaseUser) {
    if (firebaseUser == null) {
     
      Navigator.pushReplacement(
          context,
          MaterialPageRoute(
              builder: (BuildContext context) => LoginPage()));
    } else {
      Navigator.pushReplacement(context,
          MaterialPageRoute(builder: (BuildContext context) => HomePage()));
    }
  });

0

void _emailLogin() async{ final user = await _auth.signInWithEmailAndPassword(email: email, password: password);

void _emailLogin() 异步{ final user = await _auth.signInWithEmailAndPassword(email: email, password: password);

    if(user != null){
     // Do something
    }
  } catch (e) {

    String exception = Auth.getExceptionText(e);
    Flushbar(
      title: "Sign In Error",
      message: exception,
      duration: Duration(seconds: 5),
    )..show(context);

  }

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