Android 从没有中间转换变量的片段中观察ViewModel LiveData
我在android应用程序中遵循MVVM架构。(). 所有my repository函数都返回一个NetworkBoundResource对象。您可以从jetpack指南链接阅读更多关于此设计实现的信息,或者从google查看示例项目 在这个特殊的问题中,当我在屏幕上下拉时,我试图通过网络重新获取信息 当前工作实施情况 片段侦听器(当屏幕下拉时触发)Android 从没有中间转换变量的片段中观察ViewModel LiveData,android,kotlin,mvvm,android-livedata,android-architecture-components,Android,Kotlin,Mvvm,Android Livedata,Android Architecture Components,我在android应用程序中遵循MVVM架构。(). 所有my repository函数都返回一个NetworkBoundResource对象。您可以从jetpack指南链接阅读更多关于此设计实现的信息,或者从google查看示例项目 在这个特殊的问题中,当我在屏幕上下拉时,我试图通过网络重新获取信息 当前工作实施情况 片段侦听器(当屏幕下拉时触发) binding.refresh.setOnRefreshListener{ profileViewModel.refreshUserProfile
binding.refresh.setOnRefreshListener{
profileViewModel.refreshUserProfile()
}
然后在我的ViewModel中,我有一个可变的LiveData,它更新这个函数调用的值
private val\u refresh=MutableLiveData()
fun refreshUserProfile(){
_refresh.value=true
}
当\u refresh.value
更改时,它会触发开关映射
val currentUserProfile:LiveData=\u refresh.switchMap{
如果(它){
repository.getCurrentUserProfile(_username.value.toString())
}否则{
AbsentLiveData.create()
}
}
存储库功能
有趣的getCurrentUserProfile(用户名:字符串):LiveData{
返回对象:NetworkBoundResource(AppExecutors.getInstance()){
覆盖有趣的saveCallResult(项:UserProfile){
userProfileDao.update(项目)
}
重写fun shouldFetch(数据:UserProfile?):布尔值{
返回真值
}
重写fun loadFromDb():LiveData{
返回userProfileDao.load(用户名)
}
重写fun createCall():LiveData{
返回networkService.userProfileService.getUserProfileAsync(
代币
用户名
)
}
}.asLiveData()
}
然后回到我的片段,我在这个currentUserProfile
ViewModel变量上有一个观察者
profileViewModel.currentUserProfile.observe(viewLifecycleOwner,{userProfileResult->
当(userProfileResult.status){…}
})
我想做的事
我想跳过设置\u refresh.value=true
的步骤。而是像这样直接观察存储库功能:
val currentUserProfile:LiveData=
repository.getCurrentUserProfile(_username.value.toString())
但是这个实现不会触发片段中的观察者
问题
我不太明白为什么我不能用第二个实现触发observer。我也不确定我最初的实现是最优的还是正确的。如果您熟悉这种类型的设计,我将非常感谢您的反馈。我过去也遇到过类似的问题&大部分时间都与两件事有关:
dao
实例与观察livedata的dao
实例不同livedata
对象被包装在其他一些livedata中并返回。简而言之,它与dao
返回的livedata
实例不同livedata
userProfileDao.load
被包装在NetworkBoundResource.asLiveData()
&如果您查看NetworkBoundResource.result的代码,它是一个MediatorLiveData
。
因此,您没有积极地侦听由userProfileDao
返回的相同实时数据
为了确认这一点,您可以尝试收听从userProfileDao.load(username)
返回的直接livedata
。使用在存储库中创建方法(&S),请参见
你可以试着朝那个方向多挖一些。我没有使用任何依赖注入工具。我确信room数据库是单例数据库,但我不确定我的DAO是否是单例数据库。此后,我将我的实现更改为使用Flow而不是LiveData,并且在观察数据方面不再有任何问题。所以我想排除道的问题。谢谢你的回复。