У меня есть завершаемый метод аутентификации, и я хочу получить данные аутентифицированного пользователя при успешном входе в систему.
Получив их, я хочу вызвать метод onUserAuthenticated
.
Я делаю это с вложенным завершаемым (глубиной 2 уровня), так как хочу отправить и токен авторизации, полученный на login
, и данные пользователя в метод onUserAuthenticated
.
Проблема в том, что onUserAuthenticated
никогда не вызывается.
class LoginViewModel(val emailAuthentication: EmailAuthentication) : ViewModel() {
val email = MutableLiveData<String>()
val password = MutableLiveData<String>()
fun login() {
emailAuthentication.login(email = email.value!!, password = password.value!!)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Timber.d("User $email logged in")
}, { error ->
Timber.e(error, "Error logging in $email")
})
}
}
class EmailAuthenticationImpl(private val authentication: Authentication,
private val userRepository: UserRepository,
private val authRepository: AuthenticationRepository
) : EmailAuthentication {
override fun register(email: String, password: String): Completable {
return userRepository.register(email, password)
}
override fun login(email: String, password: String): Completable {
// some missing fields validation
return authRepository.login(email, password)
.flatMapCompletable { token ->
userRepository.getCurrentUser()
.flatMapCompletable {
Completable.defer {
// FIXME this never gets invoked
authentication.onUserAuthenticated(AuthType.EMAIL, it, token)
Completable.complete()
}
}
}
}
Я пытался поставить Completable.defer
также только до userRepository.getCurrentUser()
и до userRepository.getCurrentUser()
и до authentication.onUserAuthenticated(AuthType.EMAIL, it, token)
, но код никогда не достигается.
Что я делаю не так?