使用Firebase区分用户首次与二次登录跳转不同页面的问题排查
问题根因
你当前的逻辑存在核心错误:调用signInWithEmailAndPassword登录成功后,mAuth.getCurrentUser()一定不会为空,所以你的判断分支永远都会走跳转首页的逻辑,不会触发信息填写页跳转。
修复方案
提供两种可选方案,可根据业务需求选择:
方案1:通过Firebase Auth自带的新用户标识判断
仅需区分是否首次登录的场景可以用这个方法,通过登录结果的AdditionalUserInfo里的isNewUser()字段判断:
mAuth.signInWithEmailAndPassword(emailLogin, passwordLogin).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser(); if (isNewUser) { // 新用户,跳信息填写页 Intent intent = new Intent(LoginActivity.this, InformationActivity.class); startActivity(intent); Toast.makeText(LoginActivity.this, "Sign In , Successful...", Toast.LENGTH_SHORT).show(); } else { // 老用户,直接跳首页 startActivity(new Intent(LoginActivity.this, Bottom_Navigation_Bar.class)); } } else { Toast.makeText(LoginActivity.this, "Error Occurred, while Signing In... ", Toast.LENGTH_SHORT).show(); } } });
注意:该方法仅在本次登录/注册触发的回调中能拿到正确值,用户后续重启App、退出重登不会再返回新用户标识。如果存在用户首次登录未填写资料就退出的场景,该方案会导致用户下次登录直接进首页,不符合需求。
方案2:结合Firebase数据库判断资料提交状态(更符合业务需求)
你的需求核心是判断用户是否已经完成资料提交,所以更稳妥的方式是通过数据库存储用户提交状态:
- 用户完成信息填写提交后,在Firestore/实时数据库中写入对应用户uid的文档,新增
infoSubmitted字段设为true,同时存储用户填写的资料 - 登录成功后先查询该用户的文档,根据字段值判断跳转逻辑
代码示例(以Firestore为例):
mAuth.signInWithEmailAndPassword(emailLogin, passwordLogin).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { String uid = mAuth.getCurrentUser().getUid(); FirebaseFirestore db = FirebaseFirestore.getInstance(); db.collection("users").document(uid).get() .addOnSuccessListener(documentSnapshot -> { if (documentSnapshot.exists() && Boolean.TRUE.equals(documentSnapshot.getBoolean("infoSubmitted"))) { // 已提交资料,跳首页 startActivity(new Intent(LoginActivity.this, Bottom_Navigation_Bar.class)); finish(); } else { // 未提交资料,跳信息填写页 Intent intent = new Intent(LoginActivity.this, InformationActivity.class); startActivity(intent); finish(); Toast.makeText(LoginActivity.this, "Sign In , Successful...", Toast.LENGTH_SHORT).show(); } }) .addOnFailureListener(e -> { // 处理查询失败逻辑 Toast.makeText(LoginActivity.this, "获取用户信息失败:"+e.getMessage(), Toast.LENGTH_SHORT).show(); }); } else { Toast.makeText(LoginActivity.this, "Error Occurred, while Signing In... ", Toast.LENGTH_SHORT).show(); } } });
补充注意事项
- 信息填写页提交成功后再写入数据库的
infoSubmitted标记,避免提前标记导致逻辑错误 - 如果做了App启动自动登录逻辑,启动页也需要添加同样的用户状态判断,不要仅在登录页做校验
- 跳转页面后调用
finish()关闭登录页,避免用户按返回键回到登录页
内容的提问来源于stack exchange,提问作者Mubashar Hassan Minhas
相关产品推荐
相关产品推荐

