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

自定义Firebase Auth注册后Firestore存储username为null问题求助

问题根因

核心为Firebase异步操作执行顺序错误:user.updateProfile() 属于异步回调任务,你没有等待该任务执行完成就提前调用了 userManager.createUser(),此时 FirebaseUser 实例的 displayName 还未完成更新,所以写入Firestore的字段值为null。你看到的「User profile updated.」日志是在Firestore写入操作完成后才触发的,自然不会改变已经写入的null值。

修复方案

将userManager.createUser()、Toast提示、页面跳转逻辑全部移动到updateProfile的成功回调内部,确保用户资料更新完成后再执行Firestore写入操作,修复后的代码如下:

mauth.createUserWithEmailAndPassword(lEmail, lPassowrd)
    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()) {
                FirebaseUser user = mauth.getCurrentUser();
                UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                        .setDisplayName(lUsername)
                        .build();
                user.updateProfile(profileUpdates)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Log.d("filds", "User profile updated.");
                                    // 等资料更新完成后再写入Firestore
                                    userManager.createUser();
                                    Toast.makeText(SignupActivity.this, "Account created !", Toast.LENGTH_SHORT).show();
                                    startActivity(new Intent(SignupActivity.this, LoginActivity.class));
                                } else {
                                    // 可自行添加更新失败的提示逻辑
                                    Toast.makeText(SignupActivity.this, "Profile update failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
            } else{
                Toast.makeText(SignupActivity.this, "Registration error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }
    }});
额外优化建议

为了避免Firebase Auth本地缓存更新不及时导致的偶发null问题,你可以直接把注册页拿到的用户名、头像地址作为参数传给createUser方法,不用额外从Auth实例中读取,逻辑更稳妥:
修改createUser方法签名:

public void createUser(String username, String urlPicture) {
    FirebaseUser user = getCurrentUser();
    if(user != null){
        String uid = user.getUid();
        User userToCreate = new User(uid, username, urlPicture);
        Task<DocumentSnapshot> userData = getUserData();
        userData.addOnSuccessListener(documentSnapshot -> {
            this.getUsersCollection().document(uid).set(userToCreate);
        });
    }
}

调用时直接传参即可:

// 直接传入注册页输入的用户名和头像地址,没有头像传null即可
userManager.createUser(lUsername, null);

内容的提问来源于stack exchange,提问作者Tritize

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:24:02