LiveData 未在 postValue() 上更新

LiveData not updating on postValue()

我有以下 UI 搜索功能。

 View (UI)   <<  ViewModel()  << LiveData(Remote)
(Search UI)      (Search VM)     Fetch data from remote

如上所述,View 观察 ViewModel 中的特定方法,其中 returns LiveData 如下所示:

override fun onStart() {
    super.onStart()
    viewModel.finalLiveData.observe(viewLifecycleOwner, listChangeObserver)
}

// Observer responsible for updating the UI via adapter.
private val listChangeObserver: Observer<List<User>> = Observer { users ->
      users?.let { updateUI(it) } ?: run { updateUI(emptyList()) }
}

override fun onStop() {
    viewModel.finalLiveData.removeObserver(listChangeObserver)
    super.onStop()
}

在 ViewModel 中,initSearch(searchKey:String) 过滤从远程接收的 LiveData 并为视图准备最后一个:

// Initiates the search with supplied search keys.
fun initSearch(searchInput: String?) {

    // filtering happens in Deserializer() class
    finalLiveData = Transformations.map(FirebaseQueryLiveData(query)) {
        repository.getSearchList(it, searchInput, searchLocation)
    }
}

并且 initSearch 将从视图中调用为 viewModel.initSearch(searchKey)。现在,问题是,finalLiveData 从转换中接收值,但不幸的是,视图未更新。

但是,注意到如果用户尝试最近的应用程序并再次使用(通过调用 onPause()onResume()),数据会反映在视图中

有没有更好的方法来更新观察到的LiveData? 提前致谢。

userListRemote 是来自您的回购协议的 LiveData 吗?没有 lifecycleowner.

将无法工作

您可以尝试直接映射到您的 finalLiveData 而不是使用 temp:

finalLiveData = Transformations.map(userListRemote, // do your mapping here)

这样,userListRemote将使用finalLiveDataviewLifecycleOwner

问题已解决。

下面发布了解决方案。通过将 finalLiveData 设为 Mutable 并使用临时 LiveData searchLiveData 来保存结果。当 searchLiveData 更新时,finalLiveData 将更新。

https://www.reddit.com/r/androiddev/comments/e9to2o/livedata_updates_are_not_reflecting_in_view/fant2x9?utm_source=share&utm_medium=web2x

internal var finalLiveData = MutableLiveData<List<User>>()


fun initSearch(searchInput: String?) {
    val searchLiveData = Transformations.map(FirebaseQueryLiveData(query)) {
        repository.getSearchList(it)
    }

    (searchLiveData as LiveData<List<User>>).observeForever { users ->
        finalLiveData.value = users
    }
}