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
将使用finalLiveData
的viewLifecycleOwner
。
问题已解决。
下面发布了解决方案。通过将 finalLiveData 设为 Mutable 并使用临时 LiveData searchLiveData 来保存结果。当 searchLiveData 更新时,finalLiveData 将更新。
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
}
}
我有以下 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
将使用finalLiveData
的viewLifecycleOwner
。
问题已解决。
下面发布了解决方案。通过将 finalLiveData 设为 Mutable 并使用临时 LiveData searchLiveData 来保存结果。当 searchLiveData 更新时,finalLiveData 将更新。
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
}
}