10

我在 MainFragment 中创建视图模型:

 @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
   ...
    MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
   ...
}

当用户选择项目然后导航到详细信息片段时,此事务将添加到后台堆栈。

 getFragmentManager()
                .beginTransaction()
                .replace(R.id.root, Details.newInstance())
                .addToBackStack(null)
                .commit();

当用户在详细信息片段中按回时,一切正常,但如果用户在详细信息片段中旋转设备并按回:

  • 为 MainFragment 创建 ViewModel 的新实例
  • 旧实例仍然存在(未调用方法 onCleared)

这是 ViewModelProviders 中的错误吗?如何解决这个问题?在我看来,应该恢复 ViewModel。

4

3 回答 3

3

这并不是很明显,但是当您调用 时addToBackStack,片段管理器不会破坏您的片段,只会在新replace事务到来时停止它。您现在基本上在 backstack 上有两个项目,它们都是您的Details. 由于onDestroy从未调用过第一个,因此ViewModel's onCleared也从未调用过它。

在您的情况下,只需检查您的片段当前是否在容器中(例如FragmentManager.findFragment(),在这种情况下通过而不是替换它,就足够了。

于 2017-11-18T10:54:29.637 回答
1

您正在使用片段链接,但需要 Activity 使用:

MainViewModel mainViewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class);
于 2017-06-16T11:53:50.507 回答
0

这是一个已确认的问题。该修复程序在 AndroidX 1.0.0-alpha2 版本中可用。 https://issuetracker.google.com/issues/73644080

于 2018-06-26T15:15:36.637 回答