我具有以下用于搜索功能的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
提前致谢。

最佳答案

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

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

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


这样,userListRemote将使用viewLifecycleOwnerfinalLiveData

10-04 15:00