Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从没有中间转换变量的片段中观察ViewModel LiveData_Android_Kotlin_Mvvm_Android Livedata_Android Architecture Components - Fatal编程技术网

Android 从没有中间转换变量的片段中观察ViewModel LiveData

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

我在android应用程序中遵循MVVM架构。(). 所有my repository函数都返回一个NetworkBoundResource对象。您可以从jetpack指南链接阅读更多关于此设计实现的信息,或者从google查看示例项目

在这个特殊的问题中,当我在屏幕上下拉时,我试图通过网络重新获取信息

当前工作实施情况

片段侦听器(当屏幕下拉时触发)

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
    实例不同
  • 您可以记录实例并检查其是否相同。必须是单身。如果您正在使用任何类型的依赖项注入工具(例如Dagger),请检查以下内容:

    我猜你的情况很可能是第二个。当您的
    livedata
    userProfileDao.load
    被包装在
    NetworkBoundResource.asLiveData()
    &如果您查看
    NetworkBoundResource.result的代码,它是一个
    MediatorLiveData
    。 因此,您没有积极地侦听由
    userProfileDao
    返回的相同实时数据

    为了确认这一点,您可以尝试收听从
    userProfileDao.load(username)
    返回的直接
    livedata
    。使用在存储库中创建方法(&S),请参见


    你可以试着朝那个方向多挖一些。

    我没有使用任何依赖注入工具。我确信room数据库是单例数据库,但我不确定我的DAO是否是单例数据库。此后,我将我的实现更改为使用Flow而不是LiveData,并且在观察数据方面不再有任何问题。所以我想排除道的问题。谢谢你的回复。