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

Observe live data objects in fragment using activity context?

我将导航底部与共享 ViewModel 一起使用,所有片段都在导航底部内,但是当第二次调用片段时会抛出此异常

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

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

1-在fragemt中声明viewModel

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

2-Observer 实时数据对象

viewModel.msg.observe(activity!!, Observer {
     Log.i(TAG,it)
})

3-移除观察者

override fun onStop() {
    super.onStop()
    viewModel.msg.removeObservers(activity!!)
}

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

为什么要将观察者添加到具有 activity 生命周期的片段中?如果您有一些逻辑需要在片段未激活时执行,请将其添加到您的 activity。因此,您需要的不是您所拥有的:

viewModel.msg.observe(this, Observer {
    Log.i(TAG, it)
})

在您的情况下,每次重新打开片段时,您都会附加一个具有相同生命周期的新观察者,这似乎是一个错误。 Livedata 观察器经过专门设计,因此您无需手动编写代码来处理生命周期。

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

viewModel.msg.observe(viewLifecycleOwner, Observer {
            Log.i(TAG,it)
        })

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

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