让我们想象一下以下情况:我们有带有导航组件和MVVM架构的BottomNavigationView。
在这种情况下,在Fragment中,这行代码现在将工作
onViewCreated((
viewModel.isActionDone.observe(viewLifecycleOwner) {
doReaction()
}
但是这个代码会吗?
private val observer = Observer<Boolean> {
doReaction()
}
onViewCreated((
viewModel.isActionDone.observe(this, observer)
在我的应用程序中,第二个代码工作得很好,但第一个代码不能正常工作:当我移动到BottomNavigationView中的另一个元素时,观察者会被调用多次。
请注意,此代码还多次调用observer。
viewModel.isActionDone.observe(viewLifecycleOwner, observer)
С你能帮我理解第一个代码可能出了什么问题吗?
这是因为每次对片段调用onStart()
时,livedata都会再次变为活动状态,并再次发出最后一个值。您应该使用Event
类作为包装器,或者您可以使用SingleLiveEvent
类,它现在被认为是反模式。您可以阅读以下内容了解更多信息:https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150
这是因为当您移动到另一个片段时,NavController会破坏视图并停止该片段,当您返回到第一个片段时会启动片段并重新创建视图。
所以当你使用";viewLifecycleOwner;为了观察,每次返回到第一个片段时,LiveData都会发出最后一个值。但是当使用";这个";,事实并非如此。
因此,您应该考虑您需要在每次创建视图或创建每个时间片段时发射的业务,并使用合适的LifecycleOwner。
我回家帮你。