LiveData不在postValue()上更新

时间:2019-11-28 12:56:47

标签: android android-lifecycle android-livedata android-architecture-components

我具有以下用于搜索功能的UI。

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

如上所述, View 观察 ViewModel 中的特定方法,该方法返回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,并为View准备最后一个:

// 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? 预先感谢。

2 个答案:

答案 0 :(得分:2)

您的存储库中的userListRemoteLiveData吗?如果没有lifecycleowner,它将无法正常工作。

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

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

通过这种方式,userListRemote将使用viewLifecycleOwner中的finalLiveData

答案 1 :(得分:0)

问题已解决。

解决方案在下面发布。通过将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

resource "google_billing_budget" "budget_alarm" {
  ...

  budget_filter {
    projects = compact([var.create_dev ? "projects/${var.project}-dev}" : "",
                        var.create_test ? "projects/${var.project}-test}" : "",
                        var.create_prod ? "projects/${var.project}-prod" : ""])
  }
  ...
}