自定义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
相关产品推荐
相关产品推荐

