Fragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()
Posted
技术标签:
【中文标题】Fragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()【英文标题】:Fragment Recreation causes Observer to trigger onChanged() with Androidx Navigation library 【发布时间】: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
每次都会弹出,而且每次我更改方向或旋转设备时都会弹出。
我的架构在导航图中有一个Activity
,startDestination
作为我的ListFragment
,DetailFragment
作为destination
。 SupportNavigationUp
或DetailFragment
上的简单OnBackPressed
将我返回到我的ListFragment
,然后重新创建片段,从而重新注册我所有的Observers
,这会再次触发OnChanged()
,并且SnackBar
在@ 时弹出987654346@LiveData
是假的
现在我尝试了solution from here,但不幸的是,它不起作用
我也尝试过将我的LifecycleOwner
切换到我的活动,但这也不起作用。
尝试将 ViewModelProviders.of
移动到 OnCreate
和 onActivityCreated
- 不起作用
请提出更正或任何想法,以防止在导航和方向更改后弹出 SnackBar。
脚注
我已经解决了这些问题:
Multiple LiveData Observers After Popping Fragment How to avoid fragment recreation when tap back button using navigation architecture actions? Is there a way to keep fragment alive when using BottomNavigationView with new NavController?here is my complete source code
【问题讨论】:
我也有这个问题。你能解决吗? 试试proandroiddev.com/… 我也有这个问题。你解决了吗? 【参考方案1】:这个article,尤其是第 1 项,可能与您的经历有关。基本上,发生的情况是每次导航回片段时可能会产生多个观察者,因此会多次执行onChanged
。使用片段的 view 生命周期作为 LifecycleOwner
应该可以防止这种情况发生,因此您上面的代码将如下所示:
deliveriesListViewModel.isMoreDataPresent.observe(viewLifecycleOwner, Observer
if (!it) showSnackBar(getString(R.string.no_more_data))
)
【讨论】:
以上是关于Fragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()的主要内容,如果未能解决你的问题,请参考以下文章
什么机制导致在 Fragment 到 Fragment 导航中调用 View.onSaveInstanceState?
Activity被回收导致fragment的getActivity为空
从 Fragment 移动到 Activity 导致 android.os.TransactionTooLargeException