【问题标题】:Getting type mismatch when using sealed class with rxjava in kotlin在 kotlin 中使用带有 rxjava 的密封类时出现类型不匹配
【发布时间】:2019-04-17 19:39:31
【问题描述】:

我有以下代码

sealed class AddressUiState
object AddressLoading : AddressUiState()
class AddressLoadedState(val addressResponse: AddressBookResponse) : AddressUiState()
class AddressErrorState(val error: Throwable) : AddressUiState()

我有如下的 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())

    }
}

我看到编译错误和 onErrorReturn 错误 类型不匹配。必需:AddressLoadedState!找到:地址错误状态 上面的代码有什么问题?

【问题讨论】:

  • 请注意startWith { } 不起作用,请使用带有正则括号的startWith()
  • 你应该添加 rxjava 标签。

标签: kotlin rx-java rx-java2


【解决方案1】:

在你的代码中

.map { AddressLoadedState(it) }

给出一个

Observable<AddressLoadedState>

onError 函数需要一个接受异常并返回扩展 T 的函数。

Observable<T> onErrorReturn(Func1<? super Throwable, ? extends T> resumeFunction)

在这种情况下,T 是 AddressLoadedState。 AddressErrorState 没有扩展这个,所以编译器会报错。

您可以将语句拆分为多行以帮助编译器,以表明 T 实际上是一个 AddressUiState。或者你也可以像这样告诉编译器映射函数本身:

    return service.getAddresses(id)
            .map<AddressUiState> { AddressLoadedState(it) }
            .startWith(AddressLoading)
            .onErrorReturn { AddressErrorState }
            .subscribeOn(Schedulers.io())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多