我在项目中使用 Jetpack 导航组件,其中包含单个活动和一些片段。
我有一个带有从服务器端填充的列表的片段。我打电话getDataFromServer
on the onViewCreated
然后,当用户单击某个项目时,会显示一个新片段。
问题是当我按下后退按钮时,onViewCreated
在我的列表片段中再次被调用。
那么,如何防止我的第一个片段再次重新创建呢?我不想要不必要的onViewCreated
calls.
当然,我们无法阻止调用oncrateView,但是有一个简单的方法。
我们可以在初始化 ViewModel 时调用它,而不是在 onCreateView 或其他生命周期方法中调用 view.loadData()
这篇文章帮助我更好地了解 ViewModel使用架构组件时的 5 个常见错误 https://proandroiddev.com/5-common-mistakes-when-using-architecture-components-403e9899f4cb
Update:
当前的导航组件(V 2.3.0)不支持此功能,它总是在导航到另一个片段时杀死该片段。想象一下,您在片段 A 中有谷歌地图,因此每次您返回片段时,它都会再次初始化,并且相机会移动到用户位置! (真是个坏主意)。
因此,如果您遇到同样的问题,最好的方法是不要使用导航组件。
导航、保存片段状态、GitHub 问题 https://github.com/android/architecture-components-samples/issues/530
更新2:
在某些情况下,例如过滤器或分页,我们可以在 ViewModel 中使用诸如 switchMap 之类的转换,而不是在 init 函数中获取数据。
更新3:
如果您必须调用函数来从源加载数据,有很多方法可以防止再次调用该函数,第一个也是最简单的方法是不要在视图中调用 getData() ,而是在 ViewModel init 函数中调用它。第二种是使用惰性变量,另一种是在 livedata 上使用 SwitchMap。欲了解更多信息,您可以找到所有解决方案here https://proandroiddev.com/when-to-load-data-in-viewmodels-ad9616940da7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)