我在项目中使用以下版本-
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha04"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha04"
所以在我的View Model类中-
fun initView() =
Transformations.map(domain.performOperation()) {
when (it) {
...
}
}
“我的视图模型”类扩展了“基本视图模型”类,“基本视图模型”类如下所示-
open class BaseViewModel(private val coroutineCtx: CoroutineContext = Dispatchers.Main) :
ViewModel(),
CoroutineScope {
private val job = SupervisorJob()
override val coroutineContext: CoroutineContext
get() = coroutineCtx + job
override fun onCleared() {
super.onCleared()
job.cancel()
}
}
这似乎可行,但我想即兴编写代码并摆脱Base View Model类中的样板协程代码。因此,我想直接在“我的视图模型”类中使用viewModelScope.launch
。但是如何与Transformations.map
一起使用它?
答案 0 :(得分:0)
因此,如果我没事的话,也许这样的解决方案可以为您提供帮助:
您的活动/片段
lifecycleScope.launchWhenStarted {
val apiResult = viewModel.initView()
updateUI(apiResult)
}
在您的ViewModel中
private val apiDeferred = CompletableDeferred<LiveData<APIResult>>()
suspend fun initView(): LiveData<APIResult> {
viewModelScope.launch(Dispatchers.IO) {
val apiResult = domain.performOperation()
artsDeferred.complete(arts)
}
return apiDeferred.await()
}
您还可以在这里查看此视频:https://www.youtube.com/watch?v=BOHK_w09pVA&t=1230s(22分钟后)
请说出是否适合您,我也可以建议使用最新技术协程,liveData等的其他解决方案