2

问题:

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

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

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

上述代码的来源在这里

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

我的架构在导航图中Activity有 一个startDestinationas my和一个as 。或者一个简单的 on将我返回到 my然后重新创建片段,从而重新注册所有 my再次触发并且当为 false时弹出ListFragmentDetailFragmentdestinationSupportNavigationUpOnBackPressedDetailFragmentListFragmentObserversOnChanged()SnackBarnoMoreDataPresent LiveData

现在我从这里尝试了解决方案,但不幸的是,它不起作用

我也尝试过将我的活动切换LifecycleOwner到我的活动,但这也不起作用。尝试移动ViewModelProviders.oftoOnCreateonActivityCreated- 不起作用

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

脚注

我经历了这些问题:

这是我的完整源代码

4

1 回答 1

0

这篇文章,尤其是第 1 项,可能与您的经历有关。基本上,每次导航回片段时,您可能会产生多个观察者,从而执行onChanged多次。使用片段的视图生命周期LifecycleOwner应该可以防止这种情况发生,所以上面的代码看起来像这样:

deliveriesListViewModel.isMoreDataPresent.observe(viewLifecycleOwner, Observer {
        if (!it) showSnackBar(getString(R.string.no_more_data))
    })
于 2019-09-11T00:53:19.223 回答