android - 观察片段中视图模型的实时数据
问题描述
我在我的 android 应用程序中遵循 MVVM 模式。以下是我将要讨论的文件:
PresentContestsFragment
PresentContestsViewModel
这是我的视图模型代码:
private val _contests = MutableLiveData<List<ContestsShortInfoModel>>()
val contests:LiveData<List<ContestsShortInfoModel>>
get() = _contests
fun getContests() {
viewModelScope.launch{
val contestLiveData = repository.getLiveContests()
contestLiveData.observeForever {
_contests.value = it
}
}
}
这是我的片段类代码
在它的 onActivityCreated 我调用 viewModel.getContests() 然后 bindUI()
private fun bindUI() {
viewModel.contests.observe(this, Observer { list ->
list?.let{
// show this list in UI
}
})
}
一切正常,我的用户界面正在更新。我想问在视图模型中调用observeForever是否可以。如果不是,我应该如何删除观察者?
如果您有更好的方法来做到这一点,也请告诉。
请记住,当我在 repo 中调用存储库的 getLiveContests 时,我会检查是否需要从 Internet 获取新数据。无论如何,我从房间数据库返回 LiveData。如果获取了新数据,则会将其保存到房间中,并且由于我已返回 LiveData,因此我也会在 UI 中获得更新。
解决方案
observeForever 可以在 ViewModel 中使用,但一定要在 onCleared() 回调中移除观察者。
为此,请创建您自己的观察者:
var customObserver: Observer<Results> = Observer { results ->
results ?: return@Observer
viewModel.showResults(results)
}
当你observeForever时传入这个观察者:
contestLiveData.observeForever(customObserver)
移除 onCleared() 中的观察者:
contestLiveData.removeObserver(customObserver)
推荐阅读
- php - 调用未定义的函数权限()
- jenkins - 如何将“选择”参数发送到下游詹金斯工作?
- uipath - 通过命令行在多台机器上安装 UiPath Robot,无需配置即可快速部署
- xcode - 看看这个,告诉我我错过了什么
- emscripten - 致命:必须设置初始堆栈指针,共享:错误
- google-apps-script - 如何从某些列的内容创建 *.csv 文本文件?
- reactjs - 使用上下文在 react 应用的根目录中配置 apollo 链接
- java - IntelliJ IDE中的天蓝色函数调试错误
- c# - 使用 CultureInfo 将美元符号替换为 -
- ios - 如何像stack swift 5一样在数组中一个接一个地添加/插入元素