平面图无法投射到右侧
Posted
技术标签:
【中文标题】平面图无法投射到右侧【英文标题】:Flatmap fails to cast to right one 【发布时间】:2021-06-25 08:58:45 【问题描述】:我正在尝试在我的登录功能中转换 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!
【问题讨论】:
你when
的一个分支正在返回一个单曲,saveResponse
返回什么?
【参考方案1】:
问题在于flatMap
的隐式返回:
when (resp)
null -> Single.just(false)
else -> saveResponse(it)
在null
分支中,返回类型为Single<Boolean>
。
在else
分支中,您返回saveResponse
的结果。但是saveResponse
的返回类型是Unit
,因为它什么都不返回。
因此,Kotlin 将 flatMap
的返回类型推断为 Single<Boolean>
或 Unit
,其中唯一常见的超类型是 Any
。
这就是您收到错误消息的原因:Found: (BaseResponse<LoginResponse>!) → Any!
您需要让saveResponse
返回一些内容,可能还有Single<Boolean>
,具体取决于您的用例。
【讨论】:
以上是关于平面图无法投射到右侧的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化分面图(faceting)设置每个分面的标题在右侧(right side)并在右侧分面图的外侧添加整图的标题信息(facet title)