为什么FirebaseUser DisplayName不更新?

时间:2019-02-22 10:51:31

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

我的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。但是“后退”功能应完全关闭该应用程序。我想念什么或做错什么了?

帐户活动代码:

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

1 个答案:

答案 0 :(得分:1)

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

accountTextView.setText(user.getDisplayName());

紧接在回调内部:

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

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