首页 > 解决方案 > 如何将视图模型范围限定为父片段?

问题描述

所以我正在使用新的导航组件(使用单一活动原则)并使用共享视图模型在每个片段之间进行通信,但是,我已经到了有时需要清除视图模型但我找不到的地步清除它的好地方。但是 tbh 我认为与其试图自己清除它,不如让框架为我做这件事,但这并不是因为视图模型是共享的,并且仅限于活动,但我认为我可以将它们限制在一个父片段,我画了一张图来说明我正在尝试做的事情。我的导航流程因此,当我从“Child 1 Child a”返回时,我只想清除 2 个视图模型,目前视图模型永远不会被清除,试图通过在片段中调用“this”和在孩子中调用 getParentFragment 来获取当前视图模型不行,谁能举个例子?

编辑

看起来我已经在做类似的事情,但在我的情况下它不起作用,所以我将添加一些代码,这是我如何访问父片段中的第一个视图模型

model = ViewModelProviders.of(this).get(RequestViewModel.class);

然后在子片段中,我正在这样做

requestViewModel = ViewModelProviders.of(getParentFragment()).get(RequestViewModel.class);

但这并没有保留它们之间的数据,它们都附有观察员

标签: androidandroid-fragmentsviewmodelandroid-architecture-navigation

解决方案


在您的应用程序中使用Fragment-ktx 库,您可以在您的应用程序-> build.gradle 中获得如下视图模型

 implementation 'androidx.fragment:fragment-ktx:1.1.0'

// 获取ParentFragment中的 ViewModel为

 private val viewModel: DemoViewModel by viewModels()

// 在ChildFragment中获取与ViewModel相同的实例

 private val viewModel: DemoViewModel by viewModels(
    ownerProducer = { requireParentFragment() }
)

推荐阅读