【发布时间】:2021-08-23 12:41:25
【问题描述】:
我在我的 android 应用程序中遵循 MVVM 架构。 (https://developer.android.com/jetpack/guide)。我所有的存储库函数都返回一个 NetworkBoundResource 对象。您可以从 jetpack 指南链接阅读更多关于此设计实现的信息,或从 google here查看示例项目
在这个特定的问题中,当我在屏幕上下拉时,我试图通过网络重新获取信息。
当前的工作实施
片段监听器(屏幕下拉时触发)
binding.refresh.setOnRefreshListener {
profileViewModel.refreshUserProfile()
}
然后在我的 ViewModel 中,我有一个 MutableLiveData 更新此函数调用的值
private val _refresh = MutableLiveData<Boolean>()
fun refreshUserProfile() {
_refresh.value = true
}
当_refresh.value发生变化时,会触发switchMap
val currentUserProfile: LiveData<Resource<UserProfile>> = _refresh.switchMap {
if (it) {
repository.getCurrentUserProfile(_username.value.toString())
} else {
AbsentLiveData.create()
}
}
存储库函数
fun getCurrentUserProfile(username: String): LiveData<Resource<UserProfile>> {
return object : NetworkBoundResource<UserProfile, UserProfile>(AppExecutors.getInstance()) {
override fun saveCallResult(item: UserProfile) {
userProfileDao.update(item)
}
override fun shouldFetch(data: UserProfile?): Boolean {
return true
}
override fun loadFromDb(): LiveData<UserProfile> {
return userProfileDao.load(username)
}
override fun createCall(): LiveData<ApiResponse<UserProfile>> {
return networkService.userProfileService.getUserProfileAsync(
token,
username
)
}
}.asLiveData()
}
然后回到我的片段,我在这个 currentUserProfile ViewModel 变量上有一个观察者
profileViewModel.currentUserProfile.observe(viewLifecycleOwner, { userProfileResult ->
when (userProfileResult.status) {...}
})
我要做什么
我想跳过设置_refresh.value = true 的步骤。而是像这样直接观察存储库功能:
val currentUserProfile: LiveData<Resource<UserProfile>> =
repository.getCurrentUserProfile(_username.value.toString())
但是这个实现不会触发片段中的观察者。
问题 我不太明白为什么我不能用我的第二个实现来触发观察者。而且我也不确定我的初始实现是否是最佳或正确的。如果您熟悉此类设计,我将不胜感激。
【问题讨论】:
标签: android kotlin mvvm android-livedata android-architecture-components