Сейчас я сталкиваюсь с tasks, и у меня есть сомнения. После регистрации по электронной почте/пропуску мне пришлось обновить профиль пользователя. Поэтому я впервые попробовал это:
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);
Похоже, вы ожидаете, что AuthResult будет передан непосредственно mOnSignInSuccessListener. В этом конкретном случае, на мой взгляд, не стоит пытаться принудить дополнительное продолжение, чтобы вернуть значение, которое вы ищете.
Вместо того, чтобы пытаться передать AuthResult этому слушателю в качестве параметра, слушатель может просто перейти непосредственно в mainTask.getResult(), или вы можете сохранить AuthResult в переменной-члене и получить к нему доступ таким образом. В любом случае, это безопасно, потому что mOnSignInSuccessListener будет вызван только после завершения mainTask, что гарантирует готовность AuthResult.