【发布时间】:2019-05-17 22:15:42
【问题描述】:
所以我正在使用新的导航组件(具有单一活动原则)并使用共享视图模型在每个片段之间进行通信,但是,我已经到了有时需要清除视图模型但我可以找不到清理它的好地方。但是,我认为与其自己尝试清除它,不如让框架为我做这件事,但这并不是因为视图模型是共享的并限定于活动,但我认为我可以将它们限定为一个父片段,我画了一张图来说明我正在尝试做的事情。 所以当我从“Child 1 Child a”导航回来时,我只想清除 2 个视图模型,目前视图模型永远不会被清除,试图通过在片段中调用“this”来获取当前视图模型,而在孩子中调用 getParentFragment 不起作用,谁能提供一个例子?
编辑
看起来我已经在做类似的事情,但在我的情况下它不起作用,所以我将添加一些代码,这是我如何访问父片段中的第一个视图模型
model = ViewModelProviders.of(this).get(RequestViewModel.class);
然后在子片段中,我正在这样做
requestViewModel = ViewModelProviders.of(getParentFragment()).get(RequestViewModel.class);
但它不会在它们之间保留数据,它们都附有观察者
【问题讨论】:
-
您可以参考这个答案stackoverflow.com/a/52732831/10271334,如果有任何困惑,请告诉我。
-
好的,这就是我已经尝试过的,让我添加一些代码
-
我不确定我是否遗漏了什么,但您完全可以使用特定片段实例注册 ViewModel,因此您不必担心它会被片段返回。
-
如果要共享Viewmodel,则传入的对象引用必须相同。我认为您可能需要确保将相同的实例传递给 .of(...) 调用。调试或修改 toString 方法以返回唯一值并注销您在父片段和子片段中传递给 ViewModelProviders.of(...) 的值。
-
您能否尝试在父子片段中打印或调试您共享的
ViewModels的哈希码,以验证它们是否已共享?如果它们的含义相同,则它们是共享的..还要检查您的孩子的孩子片段。这可能是原因。
标签: android android-fragments viewmodel android-architecture-navigation