我在 SO 上发布了很多类似的帖子,但我仍然无法找到无法在 UI 上观察 LiveData
的原因。
我正在开展一个出于学习目的的项目。我想做的是从我的 Room
数据库中获取一个值并将其显示在 UI 上。为了清楚起见,我仅显示相关的代码 fragment 。
Dao.kt
@Query("SELECT maxValue FROM DoItAgainEntity WHERE id = :id")
fun getMaxValue(id: Int): LiveData<Int>
存储库.kt
override fun getMaxValue(activityId: Int) = doItAgainDao.getMaxValue(activityId)
ViewModel.kt
private val mMaxValue = MutableLiveData<Int>()
override fun getMaxValue(id: Int): LiveData<Int> =
Transformations.switchMap(mMaxValue) {
repository.getMaxValue(id)
}
Fragment.kt
viewModel.getMaxValue(activitiesAdapter.activities[position].id)
viewModel.getMaxValue(activitiesAdapter.activities[position].id).observe(viewLifecycleOwner, Observer {
// THIS CODE IS NEVER CALLED
Log.d("getMaxValueObserver",it.toString())
}
如何获取 LiveData
对象中提供的 Int
值?我知道,这几乎是一个新手问题,但是你能解释一下我的误解吗?
非常感谢。
最佳答案
您没有更新 LiveData,因为您这样做了 switchMap
上mMaxValue
。但 LiveData 永远不会改变(正如我从您的示例中看到的)。
您实际上并不需要该属性 private val mMaxValue = MutableLiveData<Int>()
.
您可以将函数简化为:
fun getMaxValue(id: Int): LiveData<Int> = repository.getMaxValue(id)
切换映射
Returns a LiveData mapped from the input source LiveData by applying switchMapFunction to each value set on source.
关于android - (可变)LiveData 在 UI 上没有被观察到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65684327/