Vee*_*ath 5 kotlin rx-java rx-java2
我有以下代码
sealed class AddressUiState
object AddressLoading : AddressUiState()
class AddressLoadedState(val addressResponse: AddressBookResponse) : AddressUiState()
class AddressErrorState(val error: Throwable) : AddressUiState()
Run Code Online (Sandbox Code Playgroud)
我有如下的ViewModel
class AddressViewModel constructor(private val service: SingleProfileService) : ViewModel() {
fun getDisplayableAddressState(id: String): Observable<out AddressUiState> {
return service.getAddresses(id)
.map { AddressLoadedState(it) }
.startWith(AddressLoading)
.onErrorReturn { AddressErrorState(it) }
.subscribeOn(Schedulers.io())
}
}
Run Code Online (Sandbox Code Playgroud)
我看到编译错误和错误类型不匹配的 onErrorReturn 。必填:AddressLoadedState!找到:AddressErrorState 上面的代码有什么问题?
在你的代码中
.map { AddressLoadedState(it) }
Run Code Online (Sandbox Code Playgroud)
给一个
Observable<AddressLoadedState>
Run Code Online (Sandbox Code Playgroud)
onError函数需要一个接受异常并返回扩展T的函数。
Observable<T> onErrorReturn(Func1<? super Throwable, ? extends T> resumeFunction)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,T为AddressLoadedState。AddressErrorState不会对此进行扩展,因此编译器会抱怨。
您可以将语句分成多行来帮助编译器,以表明T实际上是一个AddressUiState。或者,您也可以像这样在map函数本身上告诉编译器:
return service.getAddresses(id)
.map<AddressUiState> { AddressLoadedState(it) }
.startWith(AddressLoading)
.onErrorReturn { AddressErrorState }
.subscribeOn(Schedulers.io())
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
545 次 |
最近记录: |