Flatmap 无法转换为正确的一个
Flatmap fails to cast to right one
我试图在我的登录函数中转换一个 Observable,但我一直收到这个错误。这是我在 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!
问题出在您的 flatMap
:
的隐式 return
when (resp) {
null -> Single.just(false)
else -> saveResponse(it)
}
在null
分支中,return类型为Single<Boolean>
。
在 else
分支中,您 return saveResponse
的结果。但是 saveResponse
的 return 类型是 Unit
,因为它没有 return 任何东西。
Kotlin 因此推断出您的 flatMap
的 return 类型是 Single<Boolean>
或 Unit
,并且它们唯一常见的超类型是 Any
.
这就是您收到错误消息的原因:Found: (BaseResponse<LoginResponse>!) → Any!
您需要 saveResponse
return 一些东西,可能还有 Single<Boolean>
,具体取决于您的用例。
我试图在我的登录函数中转换一个 Observable,但我一直收到这个错误。这是我在 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!
问题出在您的 flatMap
:
when (resp) {
null -> Single.just(false)
else -> saveResponse(it)
}
在null
分支中,return类型为Single<Boolean>
。
在 else
分支中,您 return saveResponse
的结果。但是 saveResponse
的 return 类型是 Unit
,因为它没有 return 任何东西。
Kotlin 因此推断出您的 flatMap
的 return 类型是 Single<Boolean>
或 Unit
,并且它们唯一常见的超类型是 Any
.
这就是您收到错误消息的原因:Found: (BaseResponse<LoginResponse>!) → Any!
您需要 saveResponse
return 一些东西,可能还有 Single<Boolean>
,具体取决于您的用例。