【问题标题】:Fragment Recreation causes Observer to trigger onChanged() with Androidx Navigation libraryFragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()
【发布时间】:2019-12-27 21:42:10
【问题描述】:

问题:

在使用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 每次都会弹出,而且每次我更改方向或旋转设备时都会弹出。

我的架构在导航图中有一个ActivitystartDestination 作为我的ListFragmentDetailFragment 作为destinationSupportNavigationUpDetailFragment 上的简单OnBackPressed 将我返回到我的ListFragment,然后重新创建片段,从而重新注册我所有的Observers,这会再次触发OnChanged(),并且SnackBar 在@ 时弹出987654346@LiveData是假的

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

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

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

脚注

我已经解决了这些问题:

here is my complete source code

【问题讨论】:

  • 我也有这个问题。你能解决吗?
  • 我也有这个问题。你解决了吗?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多