android - 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
所示。
有没有其他方法可以实现这一目标?
解决方案
解决方案非常简单。首先在您的存储库类中创建可变的说 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()
}
推荐阅读
- swagger - 如何删除 swagger production .net core 2.1
- sql - 调度查询以在 SQL Developer 中导出 CSV 的调度运行
- c# - 如何在 Dapper 中使用 SQL 函数?
- typescript - 将泛型类型参数传递给类表达式
- python - Django Rest Framework 可选嵌套关系
- c# - 如何使统一对象的颜色100%不透明
- android - Kotlin Volley - 从另一个类访问 volley 时应用程序崩溃并出现错误
- json - 如何在 React.js 中动态更改 json 对象内的真/假语句
- .net - 在 VB.NET 中的类初始化期间可以做“数据控制流”吗?
- javascript - 用 WPML 和 Wordpress 翻译 js?