如何正确使用livedata与Transformations.switchMap获取初始数据?

问题描述 投票:0回答:1

现在我开始第一次使用LiveData。首先我把所有的代码都放在viewModel中,包括在服务器中开始搜索的代码。我是这样使用LiveData的。

Fragment onViewCreated()

        viewModel.changeNotifierContacts.observe(this, androidx.lifecycle.Observer { value -> value?.let {
        recyclerViewAdapter.setData(value)
    } })

这和预期的工作一样。现在我按照MVVM模式添加了一个仓库层。(为此,我把我的联系人搜索功能移到了仓库类中)首先,我实现了ViewModel和仓库之间的连接,像这样。

ViewModel代码

fun getContacts(): MutableLiveData<ContactGroup> {
   return contactSearchRepository.changeNotifierContacts;
}

fun search(newSearchInput: String) {
   contactSearchRepository.searchInRepository(newSearchInput)
}

现在我读到这篇文章,告诉我们不要像这样使用LiveData。https:/developer.android.comtopiclibrariesarchitecturelivedata#merge_livedata。

本页的例子。

class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {

private fun getPostalCode(address: String): LiveData<String> {
    // DON'T DO THIS
    return repository.getPostCode(address)
}

}

相反,我们应该用这样的方式。

var changeNotifierContacts : LiveData<ContactGroup> = Transformations.switchMap(searchInput) {
    address -> contactSearchRepository.getPostCode(address) }

问题:

  1. 我是否正确理解了这篇文章,或者我可以使用我的第一个实现?
  2. 在我的viewModel的构造函数中,我正在创建一个我的repository对象的实例,它开始观察服务器数据,并且它正在获取初始数据。(例如,我正在获取我所有朋友的列表)。如果我使用我的第一个实现,我正在获取这个初始数据。如果我使用的是Transformations.switchMap实现,我就得不到这个初始数据。我首先要在这里开始搜索,然后得到更新的数据。这不是我想要的,我还需要在不进行搜索的情况下显示 "我的朋友 "列表。
  3. 我在这里有没有其他方法可以使用?也许LiveData并不是连接ViewModel和Repository的最佳方案?

谢谢大家的回复和建议

android kotlin mvvm repository android-livedata
1个回答
1
投票

我对这篇文章的理解是否正确,或者我可以使用我的第一个实现吗?

我认为你做了,但我相信你把概念扩展得太多了。

如果你希望用户输入搜索来接收答案,你应该像他们说的那样做。

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
    }
}

然而,如果你是在加载一个默认的列表, 你应该像你的第一个例子那样做。

val getContact = contactSearchRepository.changeNotifierContacts

在这种情况下,你将不得不观察 getContact邮政代码.

在我的viewModel的构造函数中,我正在创建一个我的repository对象的实例,它开始观察服务器数据,并且它正在获取初始数据。(例如,我正在获取我所有朋友的列表)。如果我使用我的第一个实现,我正在获取这个初始数据。如果我使用的是Transformations.switchMap实现,我就得不到这个初始数据。我首先要在这里开始搜索,然后得到更新的数据。这不是我想要的,我还需要在不进行搜索的情况下显示 "我的朋友 "列表。

你可以用一个默认的搜索来启动你的fragmentactivity,像这样。

MyViewModel.setInput("Friends")

这样你就不需要观察两个对象了 邮政代码 将提供所有答案。

我在这里是否有其他方法可以使用?也许LiveData并不是连接ViewModel和Repository的最佳方案?

我认为LiveData是你的答案。在完成了学习曲线后,它变得更容易处理!

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.