Android 如何将livedata与Transformations.switchMap一起正确使用以获取初始数据?
现在我第一次开始使用LiveData。首先,我将所有代码放在viewModel中,包括在服务器中启动搜索的代码。 我使用的LiveData如下所示: 片段onViewCreated() 这是工作的预期。现在,我按照MVVM模式添加了一个存储库层。(为此,我将联系人搜索功能移动到存储库类) 首先,我实现了ViewModel和存储库之间的连接,如下所示: 视图模型代码:Android 如何将livedata与Transformations.switchMap一起正确使用以获取初始数据?,android,kotlin,mvvm,repository,android-livedata,Android,Kotlin,Mvvm,Repository,Android Livedata,现在我第一次开始使用LiveData。首先,我将所有代码放在viewModel中,包括在服务器中启动搜索的代码。 我使用的LiveData如下所示: 片段onViewCreated() 这是工作的预期。现在,我按照MVVM模式添加了一个存储库层。(为此,我将联系人搜索功能移动到存储库类) 首先,我实现了ViewModel和存储库之间的连接,如下所示: 视图模型代码: fun getContacts(): MutableLiveData<ContactGroup> { retur
fun getContacts(): MutableLiveData<ContactGroup> {
return contactSearchRepository.changeNotifierContacts;
}
fun search(newSearchInput: String) {
contactSearchRepository.searchInRepository(newSearchInput)
}
fun getContacts():MutableLiveData{
返回contactSearchRepository.changeNotifierContacts;
}
趣味搜索(newSearchInput:String){
contactSearchRepository.searchInRepository(newSearchInput)
}
现在我读了这篇文章,它告诉我们不要像这样使用LiveData:
本页示例:
class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {
private fun getPostalCode(address: String): LiveData<String> {
// DON'T DO THIS
return repository.getPostCode(address)
}
类MyViewModel(私有val存储库:PostalCodeRespository):ViewModel(){
private fun getPostalCode(地址:字符串):LiveData{
//不要这样做
返回存储库。getPostCode(地址)
}
}
相反,我们应该使用如下内容:
var changeNotifierContacts : LiveData<ContactGroup> = Transformations.switchMap(searchInput) {
address -> contactSearchRepository.getPostCode(address) }
MyViewModel.setInput("Friends")
var changeNotifierContacts:LiveData=Transformations.switchMap(searchInput){
地址->contactSearchRepository.getPostCode(地址)}
问题:
class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {
private val addressInput = MutableLiveData<String>()
val postalCode: LiveData<String> = Transformations.switchMap(addressInput) {
address -> repository.getPostCode(address) }
fun setInput(address: String) {
addressInput.value = address
}
}
在这种情况下,您必须遵守getContact和postalCode
在viewModel的构造函数中,我正在创建一个存储库对象的实例,该实例开始观察服务器数据,并获取初始数据。(例如,我得到了我所有朋友的名单)。如果我正在使用我的第一个实现,我将获得这个初始数据。如果我使用Transformations.switchMap实现,我就不会得到这些初始数据。我首先必须在这里开始搜索以获取更新的数据。这不是我想要的,我还需要显示“我的朋友”列表而不进行搜索
您可以使用默认搜索启动片段/活动,如下所示:
var changeNotifierContacts : LiveData<ContactGroup> = Transformations.switchMap(searchInput) {
address -> contactSearchRepository.getPostCode(address) }
MyViewModel.setInput("Friends")
这样,您不需要观察两个对象,因为postalCode将提供所有答案
这里有没有其他方法可以使用?也许LiveData不是连接ViewModel和存储库的最佳解决方案
我认为实时数据是你的答案。完成学习曲线后,它变得更容易处理
我希望有帮助 首先,谢谢你的回复!现在,我遵循你的建议,并使用我的第一个例子。如果我在我的“search”/getPostCode观察者中接收到数据,那么我将删除初始观察者。欢迎!!如果它最终回答了您的问题,请将其标记为已解决=)