【问题标题】:observing live data of view model in fragment观察片段中视图模型的实时数据
【发布时间】:2019-05-11 03:03:53
【问题描述】:

我在我的 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
    }
  })
}

一切正常,我的 UI 正在更新。我想问在视图模型中调用observeForever是否可以。如果不是,我应该如何删除观察者?

如果你有更好的方法,也请告诉。

请记住,当我在 repo 中调用存储库的 getLiveContests 时,我会检查是否需要从 Internet 获取新数据。无论如何,我从房间数据库返回 LiveData。如果获取了新数据,则会将其保存到房间中,并且由于我已返回 LiveData,因此我也会在 UI 中获得更新。

【问题讨论】:

    标签: android mvvm android-livedata android-viewmodel android-mvvm


    【解决方案1】:

    observeForever 可以在 ViewModel 中使用,但一定要在 onCleared() 回调中移除观察者。

    为此,请创建您自己的观察者:

     var customObserver: Observer<Results> = Observer { results ->
            results ?: return@Observer
            viewModel.showResults(results)
        }
    

    当你observeForever时传入这个观察者:

     contestLiveData.observeForever(customObserver) 
    

    在 onCleared() 中移除观察者:

    contestLiveData.removeObserver(customObserver)
    

    【讨论】:

    • 如何移除观察者?
    • 我知道如何重写一个方法,我在问如何删除一个观察者?
    • 我编辑了我的答案,如果有帮助,请接受答案。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2020-03-23
    • 2021-10-10
    • 2020-08-14
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多