Почему FirebaseUser DisplayName не обновляется? - PullRequest
0 голосов
/ 22 февраля 2019

Моя аутентификация Firebase основана на электронной почте (для входа в систему и регистрации требуется только адрес электронной почты и пароль), которой впоследствии управляет firebase.

My 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, TextView, который должен содержать FirebaseUser DisplayName, становится пустым.И только ПОСЛЕ нажатия, он снова открывает ту же учетную запись (почему?), И TextView обновляется с помощью DisplayName.Но функциональность «назад» должна просто полностью закрыть приложение.Что я пропускаю или делаю неправильно?

Код AccountActivity:

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();
}
}

Я предполагал, что при входе в систему обновление текущего зарегистрированного пользователя не изменит его до повторного запуска действия., но я сомневаюсь, что это так, поскольку простое нажатие назад, когда на AccountActivty сначала откроет его снова, с соответствующим DisplayName, затем повторное нажатие вернет его, чтобы правильно закрыть.

Почему сначала нажатие не закрывает его назад, но вместо этого он обновляет TextView для правильного DisplayName?Почему он не обновляется должным образом с первого раза?Извините, если я не разместил всю необходимую информацию, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 22 февраля 2019

Чтобы решить эту проблему, просто переместите следующую строку кода:

accountTextView.setText(user.getDisplayName());

Внутри обратного вызова, сразу после:

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

Попытка установить имя пользователя вне обратного вызова делаетне имеет никакого смысла, так как API Firebase являются асинхронными.Поэтому самым быстрым решением для решения этой проблемы (как вы уже видели) было использование user.getDisplayName() только внутри метода onComplete().Если вы хотите использовать его вне обратного вызова, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью специального обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...