我具有以下用于搜索功能的UI。
View (UI) << ViewModel() << LiveData(Remote)
(Search UI) (Search VM) Fetch data from remote
如上所述,View在ViewModel中观察到一个特定的方法,该方法返回LiveData如下:
override fun onStart() {
super.onStart()
viewModel.getSearchResultList().observe(viewLifecycleOwner, listChangeObserver)
}
// Observer responsible for updating the UI via adapter.
private val listChangeObserver: Observer<List<ProfessionalUser>> = Observer { users ->
users?.let { updateUI(it) }
}
override fun onStop() {
viewModel.getSearchResultList().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
val temp = Transformations.map(userListRemote, Deserializer())
finalLiveData.postValue(temp.value)
}
并且initSearch
在视图中将称为viewModel.initSearch(searchKey)
。现在的问题是,temp
从转换中接收到值,但不幸的是temp.value
返回了null
。
我们在哪里出了什么问题?最优解决方案?预先感谢。
是您仓库中的userListRemote
是LiveData
吗?没有lifecycleowner
,它将无法正常工作。
您可以尝试直接映射到您的finalLiveData
,而不是使用temp
:
finalLiveData = Transformations.map(userListRemote, // do your mapping here)
以这种方式,userListRemote
将使用viewLifecycleOwner
的finalLiveData
。