为片段再次创建 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 中旋转设备并按下返回:

这是 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