繁体   English   中英

通过 navGraphViewModel 导航返回时保留 ViewModel 实例

[英]Keep ViewModel instance when navigating back with by navGraphViewModel

因此,我遵循 Google 的方法,您对整个应用程序和多个视图模型使用单个活动,这些模型的范围仅限于您的嵌套导航图或片段。

我对这种方法有疑问。 让我们使用谷歌文档提供的示例,这样对我来说会更容易。

循环逻辑

在这里,当用户到达目的地 C 时,后退堆栈包含每个目的地(A、B、C)的一个实例,如果我们想返回目的地 A 而不在后退堆栈中增加目的地的实例 - 我们需要添加popUpTo="@+id/a"popUpToInclusive="true"清除后栈中的所有实例。

这就是问题所在 - 如果我们将使用它,那么每个旧的目的地实例都将被清除,并且将创建新的 A 实例因此如果我们使用by navGraphViewModel(R.id.A)那么我们的旧 ViewModel 实例将被清除也!

那么如何避免这种行为呢? 有没有办法在不创建新实例的情况下打开目标 A,这样我们的视图 model 也不会被清除?

我尝试了多种方法来防止这种情况,但似乎没有任何效果(在这种情况下 A - 也可能是嵌套图,并且工作方式相同)

编辑:我刚刚再次阅读了您的问题,我想我第一次误解了它。 我的回答可能帮不上什么忙。

您是否需要子(嵌套)NavGraphs? 如果不是,我认为navGraphViewModels()用于您。 根据我的阅读,使用这种方法创建的视图模型在完成相应的 NavGraph 后会被清除。

当我们为某些模块创建片段并且我们不希望这些视图模型在整个活动中持续存在时,navGraphViewModels 非常有用。 因此,我们可以使用 navGraphViewModels() 创建我们自己的自定义子导航图。

也就是说,如果你只是想实现单个活动/多个片段架构,为什么不使用每个片段内部by activityViewModels() 使用它,只要主机活动还活着,视图模型实例就会被持久化。 从而允许您在活动和所有片段之间共享数据。

参考: https://skynight1996.medium.com/navigation-component-comparison-between-viewmodels-activityviewmodels-and-ae0145734228

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM