从 modelview kotlin 类调用返回 Observable 的方法

问题描述 投票:0回答:1

我有使数据库选择并返回 Observable<> 的方法。 我如何从 Kotlin modelview calss 中调用这样的方法?

private val _response = MutableStateFlow(Response())
val response: StateFlow<Response> = _response

suspend fun getResponse() {
        viewModelScope.launch(exceptionHandler) {
            withContext(Dispatchers.IO) {
              _response.emit(apiCall)//Type mismatch. need Response but getting Observable<Response!>!
            }
        }
}

另一个班级

public Observable<Responnse> apiCall(){
    return cacheObservable.flatMap(response -> {return observableResponse});
};
database kotlin view model observable
1个回答
1
投票

kotlinx
反应库中有Rx和Kotlin协程之间的转换。添加到您的依赖项:

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.6.4"
// Match the coroutines version you are already using. 
// Change rx2 to rx3 depending on which version of Rx you're using.

然后您可以在 Observable 上调用

asFlow()
将其转换为 Flow,因此您的 ViewModel 代码将变为以下内容:

val response: StateFlow<Response> = apiCall().asFlow()
    .flowOn(exceptionHandler)
    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), Response())

无需指定调度员或创建单独的

getResponse()
函数来发起呼叫。它将在您第一次收集此流量时开始通话。

我以

WhileSubscribed(5000L)
为例。这允许在 Fragment 离开屏幕时节省资源,但如果它像在屏幕旋转期间那样短暂,则避免必须重新启动它。

© www.soinside.com 2019 - 2024. All rights reserved.