gpt4 book ai didi

android - 为 fragment 再次创建 ViewModel

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:17 25 4
gpt4 key购买 nike

我在 MainFragment 中创建 View 模型:

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

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

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

当用户在 Details fragment 中按下返回时,一切正常,但是如果用户在 Details fragment 中旋转设备并按下返回:

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

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

最佳答案

这不是很明显,但是当您调用 addToBackStack 时, fragment 管理器不会销毁您的 fragment ,只是在新的 replace 事务到来时停止它。您现在基本上在后台堆栈上有两个项目,都是您的 Details 的实例。由于 onDestroy 从未被第一个调用,因此它的 ViewModel 的 onCleared 也从未被调用。

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

关于android - 为 fragment 再次创建 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44588430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com