首页 > 解决方案 > LiveData 可以使用每次返回新 LiveData 的存储库功能从 UI 刷新?

问题描述

我在存储库类中有一个方法如下,它从本地数据库或网络返回国家列表作为 LiveData:

fun loadCountries(): LiveData<Resource<List<Country>>> {
    return object : NetworkBoundResource<List<Country>, List<CountryResponse>>() {
        ...
    }.asLiveData()
}

在 ViewModel 中,我有一个 LiveData 来保存返回的 LiveData:

class CountryViewModel : ViewModel() {

    val countryListResource: LiveData<Resource<List<Country>>> = countryRepository.loadCountries()

    fun refresh() {
        // How to assign new LiveData returned by countryRepository.loadCountries() here?
        // SwitchMap needs other LiveData to be used.
    }
}

用户应该能够刷新数据,这就是我的问题出现的地方。我需要注入返回的新 LiveData countryRepository.loadCountries()countryListResource但我不知道如何实现?

如果我这样做countryListResource = countryRepository.loadCountries()(我不能,因为它是val),观察者需要停止观察前一个并开始观察最新的。

如果我使用 swichMap on ,我需要另一个 MutableLiveData 来触发来自存储库的新调用,如此countryListResource所示。

有没有其他方法可以实现这一目标?

标签: androidmvvmandroid-livedata

解决方案


解决方案非常简单。首先在您的存储库类中创建可变的说 obj1 和不可变的说 obj2 国家列表类型的实时数据对象。obj2 用 obj1 初始化。然后loadCountry()函数应该只更新 obj1。

您的视图模型应该使用 obj2 来观察observeForever()。然后视图模型也确实创建了两个与 repo 相同的 obj,分别为 obj3 和 obj4。观察活动中的 obj4。Obj3 正在使用postValue()in更新,observeForever() 而后者又更新 obj4(使用 obj3 初始化)。

希望这对您有所帮助。

例子:

存储库

// obj1
private val _countryLiveData : MutableLiveData<List<Country>>

// obj2
val countryLiveData : LiveData<List<Country>>
        get() = _countryLiveData

fun loadCountries() {
    val list = fetchCountryList()
    _countryLiveData.postValue(list)
}

视图模型

// obj3
private val _countryLiveData : MutableLiveData<List<Country>> 

// obj4  live data to be observed in activity
val countryLiveData : LiveData<List<Country>> 
    get() = _countryLiveData

init {

countryRepository.countryLiveData.observeForever { countryList ->
         this._countryLiveData.postValue(countryList)
   }
}

fun refresh() {
    countryRepository.loadCountries()  
}

推荐阅读