Flatmap не удается преобразовать в правый

#android #kotlin #rx-java

#Android #kotlin #rx-java

Вопрос:

Я пытаюсь преобразовать наблюдаемое в моей функции входа в систему, но я продолжаю получать эту ошибку. Это мой код и ошибка, которые я получаю на flatMap

 fun login(phoneNumber: String, password: String, deviceId: String) {
        // remove previous subscriptions
        disposables.clear()

        // function to save userInfo and access token
        val saveResponse = { response: LoginResponse ->
            val user = response?.user
            val token = response?.token
//            userManager.updateToken(champion, token, deviceId)
        }

        // on success callback
        val onSuccess = { isSuccess: Boolean ->
            progressBarVisibility.postValue(false)
            loginSuccess.postValue(isSuccess)
            if (!isSuccess) errorMessage.postValue("An error occurred please try again.")
        }

        // on failure callback
        val onError = { throwable: Throwable ->
            val message = when (throwable) {
                is HttpException -> when (throwable.code()) {
                    400 -> "Enter valid Phone Number or Password"
                    422 -> "Incorrect Phone Number or Password"
                    else -> throwable.toErrorMessage()
                }

                else -> "An Error Occurred."
            }

            // show error message
            errorMessage.postValue(message)
            progressBarVisibility.postValue(false)
        }

        val disposable = accountUseCase.login(LoginRequest(phoneNumber, password)).observeOnUI()
                .doOnSubscribe { progressBarVisibility.postValue(true) }
                .flatMap {
                    val resp = it.data
                    when (resp) {
                        null -> Single.just(false)
                        else -> saveResponse(it)
                    }
                }
                .subscribe(onSuccess, onError)

        // add subscription to disposables
        disposables.add(disposable)
    }
 

ошибка

 Type mismatch. Required: ((BaseResponse<LoginResponse>!) → SingleSource<out (???..???)>!)! Found: (BaseResponse<LoginResponse>!) → Any!
 

Комментарии:

1. одна из ваших ветвей when возвращает единицу, что saveResponse возвращается?

Ответ №1:

Проблема заключается в неявном возврате вашего flatMap :

 when (resp) {
    null -> Single.just(false)
    else -> saveResponse(it)
}
 

В null ветке возвращаемый тип равен Single<Boolean> .

В else ветке вы возвращаете результат saveResponse . Но возвращаемый тип saveResponse is Unit , потому что он ничего не возвращает.

Поэтому Kotlin делает вывод, что тип возвращаемого значения your flatMap должен быть либо Single<Boolean> или Unit , и единственным общим супертипом из них является Any .

Вот почему вы получаете сообщение об ошибке: Found: (BaseResponse<LoginResponse>!) → Any!

Вам нужно saveResponse что-то вернуть, возможно, также a Single<Boolean> , в зависимости от вашего варианта использования.