带有协同程序的LiveData惰性初始化不起作用



我希望在活动启动时从API加载数据。目前,我从活动中调用视图模型的方法来加载数据,它运行良好,但我不知道这是否是最好的方法:

活动

override fun onCreate(savedInstanceState: Bundle?) {
//initialize stuff...
viewModel.myData.observe(this) {
//do things with the data
}
lifeCycleScope.launch { viewModel.loadData() }
}

ViewModel

class MyViewModel : ViewModel() {
val myData = MutableLiveData<MyData>()
suspend fun loadData() = withContext(Dispatchers.IO) {
val data = api.getData()
withContext(Dispatchers.Main) {
myData.value = data
}
}
}

我看到了一些使用惰性初始化的例子,但我不知道如何用协程实现它。我试过这个:

活动

override fun onCreate(savedInstanceState: Bundle?) {
//initialize stuff...
viewModel.myData().observe(this) {
//do things with the data
}
}

ViewModel

private val myData : MutableLiveData<MyData> by lazy {
MutableLiveData<MyData>().also {
viewModelScope.launch { 
loadData()
}    
}
}
fun myData() = myData
suspend fun loadData() = // same as above

但数据不会被提取,也不会显示任何内容。

如果您添加了依赖项livedata-ktx,那么您也可以使用livedatabuilder在同一块中调用API并发出。了解如何做到这一点:

class MyViewModel : ViewModel() {
val myData: LiveData<MyData> = liveData {
val data = api.getData() // suspended call
emit(data) // emit data once available
}
}

最新更新