【问题标题】:Why is FirebaseUser DisplayName not updating?为什么 FirebaseUser DisplayName 不更新?
【发布时间】:2019-07-16 10:53:06
【问题描述】:

我的 Firebase 身份验证是基于电子邮件的(登录和注册只需要电子邮件和密码),然后由 firebase 管理。

我的 RegistrationActivity 也要求提供电子邮件、密码和姓名,因为我想稍后在我的 AccountActivity 中使用它,以便在登录后获得类似“Hello, [Name]”的内容。为了也保存此名称,幸运的是,FirebaseUser 已经有一个名为 DisplayName 的字段,所以我所要做的就是在创建用户后立即更新用户(createUserWithEmailAndPassword(...) 也会自动执行“登录”)

RegisterActivity相关代码:

firebaseAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            Toast.makeText(RegisterActivity.this, "Could not complete registration", Toast.LENGTH_SHORT).show();
                        } else {
                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                                    .setDisplayName(name).build();
                            user.updateProfile(profileUpdates);
                            Toast.makeText(RegisterActivity.this, "Update complete", Toast.LENGTH_SHORT).show();

                            startActivity(new Intent(RegisterActivity.this, AccountActivity.class));
                            finish();

                        }


                    }
                });

但是,AccountActivity 启动后,应包含 FirebaseUser DisplayName 的 TextView 为空。只有在按下后,它才会再次打开相同的 AccountActivity(为什么?),并且 TextView 会使用 DisplayName 进行更新。但是“返回”功能应该完全关闭应用程序。我错过了什么或做错了什么?

账户活动代码:

public class AccountActivity extends AppCompatActivity {


private Button signOutBtn;

private FirebaseAuth firebaseAuth;
private FirebaseUser user;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_account);

    firebaseAuth = FirebaseAuth.getInstance();
    user = firebaseAuth.getCurrentUser();

    signOutBtn = (Button) findViewById(R.id.signOutBtn);
    signOutBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            firebaseAuth.signOut();
            startActivity(new Intent(AccountActivity.this, LoginActivity.class));
            finish();
        }
    });


    TextView accountTextView = (TextView) findViewById(R.id.AccountTextView);

    //TODO: if user.getDisplayName == null, get the NAME choice from input in RegisterActivity
    if (user.getDisplayName() == null)
    {
        accountTextView.setText("xxx");
    } else {
        accountTextView.setText(user.getDisplayName());
    }


}

@Override
public void onBackPressed() {
    finish();
}
}

我的假设是,在登录时,更新当前登录的用户在再次启动 Activity 之前不会改变它,但我怀疑情况是否如此,因为在 AccountActivty 上按下后会首先再次打开它,使用正确的 DisplayName,然后再次按下将正确关闭它。

为什么先按后退而不是关闭它,而是将 TextView 更新为正确的 DisplayName?为什么第一次没有正确更新? 很抱歉,如果我没有发布所有必要的信息,请告诉我。

【问题讨论】:

  • 你有mainactivity吗?
  • 是的,这就是登录活动。
  • 您的登录活动是否检查了用户是否已经登录?
  • user.updateProfile(profileUpdates); 是一个异步操作,您在获得响应之前启动了新活动。这就是为什么名称会在某个时间后出现(下一次呈现)。
  • 哦,好的,谢谢!有道理

标签: java android firebase android-activity firebase-authentication


【解决方案1】:

要解决这个问题,只需移动以下代码行:

accountTextView.setText(user.getDisplayName());

在回调内部,紧随其后:

Toast.makeText(RegisterActivity.this, "Update complete", Toast.LENGTH_SHORT).show();

尝试在回调之外设置用户名没有任何意义,因为 Firebase API 是异步的。因此,解决此问题的最快解决方案(如您所见)是仅在 onComplete() 方法内使用 user.getDisplayName()。如果你想在回调之外使用它,我建议你从这个 post 中查看我的 anwser 的最后一部分,我在其中解释了如何使用自定义回调来完成它。您也可以看看这个 video 以获得更好的理解。

【讨论】:

  • 您好,对不起,我忘记正确标记了。是的,你的回答是最有帮助的。还有视频!非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2019-06-19
  • 1970-01-01
相关资源
最近更新 更多