我具有以下用于搜索功能的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
?
预先感谢。
答案 0 :(得分:2)
您的存储库中的userListRemote
是LiveData
吗?如果没有lifecycleowner
,它将无法正常工作。
您可以尝试直接映射到您的finalLiveData
而不是使用temp
:
finalLiveData = Transformations.map(userListRemote, // do your mapping here)
通过这种方式,userListRemote
将使用viewLifecycleOwner
中的finalLiveData
。
答案 1 :(得分:0)
问题已解决。
解决方案在下面发布。通过将finalLiveData设置为Mutable,并使用临时LiveData searchLiveData来保存结果。随着searchLiveData更新,finalLiveData也将更新。
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" : ""])
}
...
}