片段恢复导致观察者使用Androidx导航库触发onChanged()

时间:2019-08-22 14:19:58

标签: android android-fragments android-architecture-navigation android-jetpack-navigation

问题:

在使用Navigation库时,当我导航回到上一个片段时,它会重新创建该片段,从而重新注册我的所有Observers,这会再次触发OnChanged()

我有一个Snackbar,其中显示了一些错误消息示例,如果我正在寻找不存在的数据或没有与服务器的Internet连接:

deliveriesListViewModel.isMoreDataPresent.observe(this, Observer {
        if (!it) showSnackBar(getString(R.string.no_more_data))
    })

Source of above code here

每次来回导航时,SnackBar都会弹出,并且每次我改变方向或旋转设备时都会弹出。

我的体系结构在导航图中有一个Activity,其中startDestination是我的ListFragment,另外一个DetailFragmentdestinationSupportNavigationUpOnBackPressed上的简单DetailFragment返回我的ListFragment,然后重新创建该片段,并因此重新注册触发{{1 }},并且当Observers OnChanged()为假时弹出SnackBar

现在我尝试了solution from here,但不幸的是,它不起作用

我也曾尝试将noMoreDataPresent切换为我的活动,但这也不起作用。 尝试将LiveData移至LifecycleOwnerViewModelProviders.of-不起作用

请提出更正或任何想法,以防止SnackBar在导航和方向更改后弹出。

脚注

我经历了以下问题:

here is my complete source code

1 个答案:

答案 0 :(得分:0)

article,尤其是项目1,可能与您所遇到的情况有关。基本上,发生的情况是,每次导航回到片段时,您可能都有多个派生的观察者,从而多次执行onChanged。使用片段的 view 生命周期作为LifecycleOwner可以防止这种情况发生,因此上面的代码如下所示:

deliveriesListViewModel.isMoreDataPresent.observe(viewLifecycleOwner, Observer {
        if (!it) showSnackBar(getString(R.string.no_more_data))
    })