【问题标题】:Firestore user.getUsername() return null valueFirestore user.getUsername() 返回空值
【发布时间】:2021-09-12 07:34:01
【问题描述】:

在我的应用程序中,我使用 firebase 制作了一个身份验证系统。我没有使用firebase的默认页面,而是在单击按钮后使用电子邮件和密码制作了一个自定义页面:

mauth.createUserWithEmailAndPassword(lEmail, lPassowrd)
    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful())
            {
                userManager.createUser();  //CREER USER DANS DATABASE FIRESTORE (PAREIL POUR EMAIL)

                Toast.makeText(SignupActivity.this, "Account created !", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(SignupActivity.this, LoginActivity.class));

            } else{
                Toast.makeText(SignupActivity.this, "Registration error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }
    }});

我添加了一行在 FireStore 中创建用户,稍后在代码中我使用 FireStore 数据更新他的用户名和图片。由于用户名为空,这会导致崩溃。

当我检查 Firestore 数据库时,创建了一个带有 id 的用户,但个人资料图片和用户名为空。知道为什么吗?当我只使用来自 FireBase 身份验证的信息时,用户有一个 id 和一个用户名(没有图片,但没关系)。

这是在 FireStore 上创建用户的函数,之前称为:

public void createUser() {
    FirebaseUser user = getCurrentUser();
    if(user != null){
        String urlPicture = (user.getPhotoUrl() != null) ? user.getPhotoUrl().toString() : null;
        String username = user.getDisplayName();

        //QUAND ON CREER UN DOCUMENT SUR FIRESTORE IL A AUTO UN ID UNIQUE
        //MAIS DANS NOTRE CAS L'USER A UN ID LORSQUON L'A CREER AVEC L'AUTHENTIFICATION
        String uid = user.getUid();

        User userToCreate = new User(uid, username, urlPicture);

        Task<DocumentSnapshot> userData = getUserData();
        // If the user already exist in Firestore, we get his data (isMentor)
        userData.addOnSuccessListener(documentSnapshot -> {
            //if (documentSnapshot.contains(IS_MENTOR_FIELD)){
                //userToCreate.setIsMentor((Boolean) documentSnapshot.get(IS_MENTOR_FIELD));
            //}
            this.getUsersCollection().document(uid).set(userToCreate);
        });
    }
}

非常感谢我的解决方案,因为我现在坚持了一段时间

编辑:

我尝试像这样修改 displayName :

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);
                user.updateProfile(profileUpdates)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Log.d("filds", "User profile updated.");
                                }
                            }
                        });

                userManager.createUser();  //CREER USER DANS DATABASE FIRESTORE (PAREIL POUR EMAIL)


                Toast.makeText(SignupActivity.this, "Account created !", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(SignupActivity.this, LoginActivity.class));

            } else{
                Toast.makeText(SignupActivity.this, "Registration error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }
    }});

logcat 显示“用户配置文件已更新”。但用户名在 FireStore 中仍然为空:/

【问题讨论】:

  • 我可以看到您正在使用 displayName 作为用户名,但您没有更新 displayName。您需要在 successListener 中执行此操作,并且只有在完成后才调用 createUser()
  • 我尝试过并编辑我的帖子以显示修改,如果您有任何想法,仍然无法正常工作

标签: android firebase google-cloud-firestore firebase-authentication


【解决方案1】:

当我检查 Firestore 数据库时,创建了一个带有 id 的用户,但个人资料图片和用户名为空。知道为什么吗?

当您使用电子邮件和密码对用户进行身份验证时,这意味着创建了一个 FirebaseUser 类型的新实例。由于您只从用户那里获取电子邮件地址和密码,因此填充的类的唯一字段是“电子邮件”。由于没有涉及用户名,也没有个人资料图片,因此当您使用 getDisplayName()getPhotoUrl() 时,您得到的结果为空,因此该结果。如果您也想填充这些字段,那么您应该考虑从用户那里获取该信息,或者使用available providers 之一。它可以是 Google、Facebook 或任何其他提供商。这样,您将同时填充用户名和个人资料图片 URL。

【讨论】:

  • 我添加了用户在登录前填写的“用户名”字段。但是我不能使用这个字符串来修改 user.displayName (我猜它是由firebase自动创建的?)。用户输入电子邮件、密码和用户名,但我无法修改用户的显示名称........这让我抓狂我什至无法在调试 idk 中检查变量为什么我的 Log.d 从未出现在愚蠢的 logcat 中.....
  • 在这种情况下,您应该update the FirebaseUser object。试一试,告诉我它是否有效。
  • 我已经试过了,告诉我你对我所做的修改的看法,我在 EDIT 中复制主帖中的代码
  • 是的,看起来不错。 Log.d("filds", "User profile updated."); 被触发了吗?如果是,请务必在第二个“onComplete”中移动 userManager.createUser();,因为Firebase API 是异步的,对吗?现在可以用了吗?
  • 很高兴听到您成功了 :) 不客气,Tritize。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2021-02-09
  • 2021-08-12
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
相关资源
最近更新 更多