Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将livedata与Transformations.switchMap一起正确使用以获取初始数据?_Android_Kotlin_Mvvm_Repository_Android Livedata - Fatal编程技术网

Android 如何将livedata与Transformations.switchMap一起正确使用以获取初始数据?

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

现在我第一次开始使用LiveData。首先,我将所有代码放在viewModel中,包括在服务器中启动搜索的代码。 我使用的LiveData如下所示:

片段onViewCreated()

这是工作的预期。现在,我按照MVVM模式添加了一个存储库层。(为此,我将联系人搜索功能移动到存储库类) 首先,我实现了ViewModel和存储库之间的连接,如下所示:

视图模型代码:

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(地址)}
问题:

  • 我是否正确理解了本文,或者是否可以使用我的第一个实现
  • 在viewModel的构造函数中,我正在创建一个存储库对象的实例,该实例开始观察服务器数据,并获取初始数据。(例如,我得到了我所有朋友的名单)。如果我正在使用我的第一个实现,我将获得这个初始数据。如果我使用Transformations.switchMap实现,我就不会得到这些初始数据。我首先必须在这里开始搜索以获取更新的数据。这不是我想要的,我还需要显示“我的朋友”列表而不进行搜索
  • 这里有没有其他方法可以使用?也许LiveData不是连接ViewModel和存储库的最佳解决方案
  • 感谢您的回复和建议

    我是否正确理解了本文,或者是否可以使用我的第一个实现

    我想是的,但我相信你把这个概念扩展得太多了

    如果您希望用户输入搜索以接收答案,则应按照他们所说的操作:

    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观察者中接收到数据,那么我将删除初始观察者。欢迎!!如果它最终回答了您的问题,请将其标记为已解决=)