Far*_*ABZ 6 android fragment android-fragments fragment-lifecycle android-architecture-navigation
我Jetpack Navigation Component在我的项目中使用了信号活动和一些片段。
我有一个片段,其中包含从服务器端填充的列表。我在onViewCreated方法上调用getDataFromServer ,然后当用户单击项目时显示新片段。
问题是当我按下后退按钮时,onViewCreated再次在列表片段中调用。
那么如何防止重新创建我的第一个片段?我不想onViewCreated打。
当然,我们无法阻止调用oncrateView,但是有一个简单的方法。我们可以在初始化 ViewModel 时调用它,而不是在 onCreateView 或其他生命周期方法中调用 view.loadData()
这篇文章帮助我更好地了解 ViewModel 使用架构组件时的 5 个常见错误
更新:
当前的导航组件(V 2.3.0)不支持此功能,它总是在导航到另一个片段时杀死该片段。想象一下,您在片段 A 中有谷歌地图,因此每次您返回片段时,它都会再次初始化,并且相机会移动到用户位置!(真是个坏主意)。
因此,如果您遇到同样的问题,最好的方法是不要使用导航组件。
更新2:
在某些情况下,例如过滤器或分页,我们可以在 ViewModel 中使用诸如 switchMap 之类的转换,而不是在 init 函数中获取数据。
更新3:
如果您必须调用函数来从源加载数据,有很多方法可以防止再次调用该函数,第一个也是最简单的方法是不要在视图中调用 getData() ,而是在 ViewModel init 函数中调用它。第二种是使用惰性变量,另一种是在 livedata 上使用 SwitchMap。欲了解更多信息,您可以在这里找到所有解决方案
当按下后退按钮时,您无法阻止调用 onViewCreated 方法或片段的任何方法,因此您应该更好地将视图模型与列表片段一起使用,并从视图模型中的服务器获取数据。避免在片段中从服务器获取数据,因为您已经使用了导航 UI。
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |