android - (可变)LiveData 在 UI 上没有被观察到

标签 android android-livedata

我在 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,因为您这样做了 switchMapmMaxValue 。但 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/

相关文章:

android gcm推送通知仅播放声音,不显示在顶部

android - 为我们现有的客户部署工具到 iPhone 和 Android

android - Realm 结果的 LiveData Observer 第一次没有被触发

android - 如何在 Android Switch 中添加第三状态?

android - 构建时 android 项目的自动 Javadoc

android - 如何知道连接到 chromecast 的设备

android - Live Data Observer 只调用了一次。当再次调用 api 更新 UI 时,它不会从服务器更新数据

java - 在非 View 或非 ViewModel 类中观察 LiveData

kotlin - 安卓 : unit testing of LiveData and Flow

android - fragment 中的 ViewModel 清除屏幕旋转时的值