gpt4 book ai didi

java - 为什么 FirebaseUser DisplayName 不更新?

转载 作者:行者123 更新时间:2023-12-02 10:13:34 24 4
gpt4 key购买 nike

我的 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 将为 null。只有在按回键后,它才会再次打开相同的 AccountActivity(为什么?),并且 TextView 会使用 DisplayName 进行更新。但“返回”功能应该完全关闭应用程序。我错过了什么或做错了什么?

帐户 Activity 代码:

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?为什么第一次不能正确更新?很抱歉,如果我没有发布所有必要的信息,请告诉我。

最佳答案

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

accountTextView.setText(user.getDisplayName());

在回调内部,就在:

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

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

关于java - 为什么 FirebaseUser DisplayName 不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54825486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com