You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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数据库判断资料提交状态(更符合业务需求)

你的需求核心是判断用户是否已经完成资料提交,所以更稳妥的方式是通过数据库存储用户提交状态:

  1. 用户完成信息填写提交后,在Firestore/实时数据库中写入对应用户uid的文档,新增infoSubmitted字段设为true,同时存储用户填写的资料
  2. 登录成功后先查询该用户的文档,根据字段值判断跳转逻辑
    代码示例(以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:30:04