带有协程的 LiveData 延迟初始化不工作

LiveData lazy init with coroutines not working

我想在 activity 启动时从 API 加载数据。目前,我从 activity 调用视图模型的方法来加载数据,它工作正常,但我不知道这是否是最好的方法:

Activity

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

视图模型

class MyViewModel : ViewModel() {

  val myData = MutableLiveData<MyData>()

  suspend fun loadData() = withContext(Dispatchers.IO) {
     val data = api.getData()
     withContext(Dispatchers.Main) {
       myData.value = data
     }
  }

}

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

Activity

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

视图模型

private val myData : MutableLiveData<MyData> by lazy {
    MutableLiveData<MyData>().also {
        viewModelScope.launch { 
            loadData()
        }    
    }
}

fun myData() = myData

suspend fun loadData() = // same as above

但是没有获取数据,也没有显示任何内容。

如果您添加了依赖项 livedata-ktx,那么您可以使用 livedata 构建器在同一个块中调用 API 并发出。查看如何操作:

class MyViewModel : ViewModel() {

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