问题:
在使用Navigation
库时,当我导航回到上一个片段时,它会重新创建该片段,从而重新注册我的所有Observers
,这会再次触发OnChanged()
>
我有一个Snackbar
,其中显示了一些错误消息示例,如果我正在寻找不存在的数据或没有与服务器的Internet连接:
deliveriesListViewModel.isMoreDataPresent.observe(this, Observer {
if (!it) showSnackBar(getString(R.string.no_more_data))
})
每次来回导航时,SnackBar
都会弹出,并且每次我改变方向或旋转设备时都会弹出。
我的体系结构在导航图中有一个Activity
,其中startDestination
是我的ListFragment
,另外一个DetailFragment
是destination
。 SupportNavigationUp
或OnBackPressed
上的简单DetailFragment
返回我的ListFragment
,然后重新创建该片段,并因此重新注册触发{{1 }},并且当Observers
OnChanged()
为假时弹出SnackBar
现在我尝试了solution from here,但不幸的是,它不起作用
我也曾尝试将noMoreDataPresent
切换为我的活动,但这也不起作用。
尝试将LiveData
移至LifecycleOwner
和ViewModelProviders.of
-不起作用
请提出更正或任何想法,以防止SnackBar在导航和方向更改后弹出。
脚注
我经历了以下问题:
答案 0 :(得分:0)
此article,尤其是项目1,可能与您所遇到的情况有关。基本上,发生的情况是,每次导航回到片段时,您可能都有多个派生的观察者,从而多次执行onChanged
。使用片段的 view 生命周期作为LifecycleOwner
可以防止这种情况发生,因此上面的代码如下所示:
deliveriesListViewModel.isMoreDataPresent.observe(viewLifecycleOwner, Observer {
if (!it) showSnackBar(getString(R.string.no_more_data))
})