#android #firebase #firebase-authentication
#Android #firebase #firebase-аутентификация
Вопрос:
Прямо сейчас я сталкиваюсь с задачами, и у меня есть сомнения. После регистрации по электронной почте / pass мне пришлось обновить профиль пользователя. Итак, я впервые попробовал это:
FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password);
.continueWithTask(new Continuation<AuthResult, Task<Void>>() {
@Override
public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception {
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName(fullname)
.build();
return t.getResult().getUser().updateProfile(profileUpdates);
}
})
.addOnFailureListener(this, mOnSignInFailureListener)
.addOnSuccessListener(this, mOnSignInSuccessListener); // <- problem!
Проблема в последней строке, мой слушатель ожидает AuthResult
параметра, но updateProfile
задача отправляет Void
. Я разобрался с этой ситуацией, как показано ниже, но это кажется слишком запутанным. Скажите мне, есть ли другой лучший способ сделать это:
final Task<AuthResult> mainTask;
mainTask = FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password);
mainTask
.continueWithTask(new Continuation<AuthResult, Task<Void>>() {
@Override
public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception {
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName(fullname)
.build();
return t.getResult().getUser().updateProfile(profileUpdates);
}
})
.continueWithTask(new Continuation<Void, Task<AuthResult>>() {
@Override
public Task<AuthResult> then(@NonNull Task<Void> t) throws Exception {
return mainTask;
}
})
.addOnFailureListener(this, mOnSignInFailureListener)
.addOnSuccessListener(this, mOnSignInSuccessListener);
Ответ №1:
Похоже, вы ожидаете, что AuthResult будет передан непосредственно в monsigninsucccesslistener. В данном конкретном случае, на мой взгляд, не стоит пытаться принудительно выполнить дополнительное продолжение, чтобы вернуть искомое значение.
Вместо того, чтобы пытаться организовать передачу AuthResult этому слушателю в качестве параметра, слушатель может просто обратиться непосредственно к MainTask.GetResult(), или вы можете сохранить AuthResult в переменной-члене и получить к нему доступ таким образом. В любом случае, это безопасно, потому что mOnSignInSuccessListener будет вызван только после завершения MainTask, что гарантирует готовность AuthResult.