将 livedata 与协程一起使用时,何时使用 emit() 而不是 postValue

When to use emit() instead of postValue when using livedata with coroutines

我需要从挂起函数的 return 值中获取 liveData。为此-

  1. 我可以启动协程(例如使用 viewmodelScope)并使用 postValue 更新 MutableLiveData 实例。
val apiLiveData = MutableLiveData<MenuItem?>()
fun getLiveData(): LiveData<MenuItem?> {
        viewModelScope.launch {
             apiLiveData.postValue(Repository.getMenuItem())
        }
        return apiLiveData
}
  1. 我可以使用 livedata {} 并发出挂起函数的 returned 值。
val apiLiveData: LiveData<MenuItem?> = liveData {
        emit(Repository.getMenuItem())
    }

我应该使用以上哪种方法?

如果您打算只使用 emit() 制作 liveData,那么您最好使用选项 1,因为它会用更少的样板执行相同的操作。

如果您所做的只是发出一个值,那么除了一个事实之外,我看不出两者之间有任何显着差异。第二个示例创建一个 LiveData,它在配置更改期间保持活动状态一段时间。那可能没有任何显着的好处。

随心所欲。似乎第二个示例更简单,代码行更少。