为片段再次创建 ViewModel
ViewModel is created again for the fragment
我在 MainFragment 中创建视图模型:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
...
}
当用户 select 项目然后导航到详细信息片段时,此事务将添加到后台堆栈。
getFragmentManager()
.beginTransaction()
.replace(R.id.root, Details.newInstance())
.addToBackStack(null)
.commit();
当用户在 Details fragment 中按下返回时,一切正常,但是如果用户在 Details fragment 中旋转设备并按下返回:
- 为 MainFragment 创建了新的 ViewModel 实例
- 旧实例仍然存在(未调用方法 onCleared)
这是 ViewModelProvider 中的错误吗?如何解决这个问题?
在我看来,应该恢复 ViewModel。
您正在使用 link 进行分段,但需要 Activity 使用:
MainViewModel mainViewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class);
这不是很明显,但是当您调用 addToBackStack
时,片段管理器不会销毁您的片段,只是在新的 replace
事务到来时停止它。你现在基本上在后台有两个项目,都是你的 Details
的实例。由于 onDestroy
从未被第一个调用,因此其 ViewModel's
onCleared
也从未被调用。
在您的情况下,只需检查您的片段当前是否在容器中(例如通过 FragmentManager.findFragment()
而不是在这种情况下替换它就足够了。
这是一个已确认的问题。该修复程序在 AndroidX 1.0.0-alpha2 版本中可用。
https://issuetracker.google.com/issues/73644080
我在 MainFragment 中创建视图模型:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
...
}
当用户 select 项目然后导航到详细信息片段时,此事务将添加到后台堆栈。
getFragmentManager()
.beginTransaction()
.replace(R.id.root, Details.newInstance())
.addToBackStack(null)
.commit();
当用户在 Details fragment 中按下返回时,一切正常,但是如果用户在 Details fragment 中旋转设备并按下返回:
- 为 MainFragment 创建了新的 ViewModel 实例
- 旧实例仍然存在(未调用方法 onCleared)
这是 ViewModelProvider 中的错误吗?如何解决这个问题? 在我看来,应该恢复 ViewModel。
您正在使用 link 进行分段,但需要 Activity 使用:
MainViewModel mainViewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class);
这不是很明显,但是当您调用 addToBackStack
时,片段管理器不会销毁您的片段,只是在新的 replace
事务到来时停止它。你现在基本上在后台有两个项目,都是你的 Details
的实例。由于 onDestroy
从未被第一个调用,因此其 ViewModel's
onCleared
也从未被调用。
在您的情况下,只需检查您的片段当前是否在容器中(例如通过 FragmentManager.findFragment()
而不是在这种情况下替换它就足够了。
这是一个已确认的问题。该修复程序在 AndroidX 1.0.0-alpha2 版本中可用。 https://issuetracker.google.com/issues/73644080