使用活动上下文观察片段中的实时数据对象?

Mah*_*Tag 1 android kotlin android-livedata android-viewmodel

我正在使用导航底部与导航底部ViewModel内的所有片段共享,但它在第二次调用片段时抛出此异常

java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles

我试图让所有观察者都附加到活动而不是它的片段,如下所示

1-在fragemt中声明viewModel

viewModel = activity?.run { 
          ViewModelProviders.of(this,viewModelFactory).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
Run Code Online (Sandbox Code Playgroud)

2-观察者实时数据对象

viewModel.msg.observe(activity!!, Observer {
     Log.i(TAG,it)
})
Run Code Online (Sandbox Code Playgroud)

3- 移除观察者

override fun onStop() {
    super.onStop()
    viewModel.msg.removeObservers(activity!!)
}
Run Code Online (Sandbox Code Playgroud)

这段代码对我来说工作正常,但我想知道我的代码是否正确并且可能工作?提前致谢

Sha*_*tab 5

这是我们在片段中使用实时数据时常犯的错误。在片段上使用this/activity可以重复。您应该viewLifecycleOwner用于片段中的实时数据观察。

viewModel.msg.observe(viewLifecycleOwner, Observer {
            Log.i(TAG,it)
        })
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读本文https://medium.com/@cs.ibrahimyilmaz/viewlifecycleowner-vs-this-a8259800367b

您不需要手动移除观察者。