【问题标题】:Shared viewModel achived fragment lifecycle共享 viewModel 实现了片段生命周期
【发布时间】:2019-07-03 11:48:21
【问题描述】:

如何在没有活动的情况下将共享 viewModel 与片段一起使用? 就像在代码中一样,但使用 ParentFragment 代替 requireActivity()。在这种情况下,当 ParentFragment 将被销毁时,SharedViewModel 被清除,但是当我从活动中提供 SharedViewModel 时,ParentFragment 被销毁时它不会被清除。

而且我使用导航组件,这意味着我不能为片段设置标签,然后使用 findFragmentByTag()


class ParentFragment:Fragment{

    override fun onCreate(savedInstanceState: Bundle?) {
      var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
    }
}

class ChildFragment:Fragmnet{
   override fun onCreate(savedInstanceState: Bundle?) {
      var viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class)
    }

}


【问题讨论】:

  • 您是否尝试过在ChildFragment 类中使用parentFragment 代替requireActivity()
  • @djhs16 不,我不知道如何从ChildFragment 访问ParentFragment。我不知道如何在FragmentManager 中找到ParentFragment
  • 你试过fragment.getParentFragment()吗?
  • @EpicPandaForce ParentFragment 是错误的。因为它是包含当前片段的片段,而不是以前从当前添加到片段管理器的片段。

标签: android viewmodel android-architecture-components


【解决方案1】:

您可以尝试scoped-vm - 它允许您为由 String 键标识的 scope 请求 ViewModel。作用域一直存在,直到请求 ViewModel 的最后一个片段被销毁,然后 ViewModel 被清除。

您可以使用此代码在 ParentFragment 和 ChildFragment 中获取 SharedViewModel。

ScopedViewModelProviders
     .forScope(this, "scope")
     .of(requireActivity())
     .get(SharedViewModel::class.java)

【讨论】:

  • 是的,正是需要。谢谢
【解决方案2】:

看到你可以在你想要共享viewmodel的所有片段中初始化viewModel,并将Rx与viewModel一起使用,你在这些片段中的所有进程将继续运行直到你想取消它,你可以从Activity调用viewModel.oncleard()或片段。

public override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
// or cancel any process
}

If you do not know ViewModel Scope, please check this image

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多