使用Navigation方向跳转fragment时如何保留原fragment的数据?
解决方案
方案1:将Fragment2配置为对话框目的地(优先推荐,完全匹配弹窗需求)
该方案下跳转Fragment2时不会销毁Fragment1的视图,返回时所有状态完全保留,无需额外做数据保存逻辑。
- 修改Fragment2的继承父类为
DialogFragment,替代原有普通Fragment - 修改导航图配置,将Fragment2的目的地标签从
<fragment>改为<dialog>:
<dialog android:id="@+id/fragment2" android:name="你的包名.Fragment2" android:label="Fragment2" />
- 原有跳转逻辑无需修改,直接使用现有代码即可生效。
方案2:保留普通Fragment目的地的修复方法
如果不需要弹窗样式,仍使用普通Fragment跳转,按以下步骤修改:
修正ViewModel作用域
不要使用Fragment自身作用域的ViewModel,改为使用宿主Activity作用域,确保ViewModel不会随Fragment1的视图销毁而重置:
// Fragment1中获取ViewModel的代码 val viewModel by activityViewModels<你的ViewModel类>()
避免重复请求数据
在ViewModel中增加加载标记,仅首次进入页面时触发数据拉取:
class 你的ViewModel类 : ViewModel() { private var hasLoaded = false val 列表数据 = MutableLiveData<List<你的数据类型>>() fun 拉取数据方法() { if (hasLoaded) return viewModelScope.launch { // 原有数据请求逻辑 列表数据.postValue(请求结果) hasLoaded = true } } }
可选:保存RecyclerView滚动状态
如果需要保留列表滚动位置,增加以下逻辑:
private var 列表状态: Parcelable? = null override fun onDestroyView() { super.onDestroyView() 列表状态 = recyclerView.layoutManager?.onSaveInstanceState() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 原有初始化逻辑 viewModel.列表数据.observe(viewLifecycleOwner) { data -> adapter.submitList(data) 列表状态?.let { recyclerView.layoutManager?.onRestoreInstanceState(it) 列表状态 = null } } viewModel.拉取数据方法() }
内容的提问来源于stack exchange,提问作者An Dương
相关产品推荐
相关产品推荐

