gpt4 book ai didi

android - 如何在一组特定 fragment 之间共享 ViewModel 范围,而不使用 NavGraphs 或将其范围限定到 Activity ?

转载 作者:行者123 更新时间:2023-12-05 06:00:40 46 4
gpt4 key购买 nike

Google 通过将 SharedViewModel 限定在 Activity 范围内声明在 Fragment 之间进行通信时使用 SharedViewModel。

在单个 Activity 应用程序中,这意味着 Activity 将散布着可能不再需要的 ViewModel,它们将在整个生命周期内保留在那里。考虑一些示例,例如扩展的注册流程或考虑几个屏幕的内容。

推荐的一种方法是使用父 fragment 作为范围,但这只有在有父 fragment 的情况下才有可能。它可以只是不同的 fragment 。

我想出了以下解决方案,我想知道它的可行性如何或有多糟糕,是否有更好的解决方案?

为了简单起见,考虑到我有两个名为 ExampleOneFragmentExampleTwoFragment 的 Fragment,我希望它们有一个共享范围,而不是实际将其范围限定到 Activity。假设我想从 ExampleTwoFragment 更新 ExampleOneFragment 中的 TextView ,所以我为两者创建了一个这样的 SharedViewModel

对于 ExampleOneFragment 它将是:

 private val mSharedViewModel by lazy {
ViewModelProvider(this).get(SharedViewModel::class.java)
}

对于ExampleTwoFragment,我想到了这个:

private val mSharedViewModel by lazy {
ViewModelProvider(supportFragmentManager().findFragmentByTag(ExampleOneFragment.TAG) ?: this).get(SharedViewModel::class.java)
}

这似乎可行,但我不知道这会导致什么样的问题。

我发现的其他一些解决方案是:根据@mikhehc here我们实际上可以创建自己的 ViewModelStore。这将使我们能够精细地控制 ViewModel 必须存在的范围。但我不明白如何让它适用于 Fragments?

其次,仍然是将其范围限定到 Activity 的 hacky 方法,但使用与 I found here 相同的键通过虚拟 View 模型将其清除

谁能指导我什么是正确的方法?我不能转移到 NavGraphs,因为它是一个已经启动并正在运行的项目,而且 Activity 的范围感觉不对。谢谢。

最佳答案

This seems to be working, but I don't know what kind of issues can this cause.

此代码仅在以下情况下有效:

  • 始终首先创建一个ExampleOneFragment
  • 它总是通过 ExampleOneFragment.TAG 标签添加到 ExampleTwoFragment 使用的同一个 FragmentManager

如果这些假设中的任何一个失败,您将得到单独的 View 模型实例,因为 supportFragmentManager().findFragmentByTag(ExampleOneFragment.TAG) ?: this 将解析为 this.

But I don't understand how to make it work for Fragments?

您可以按照该答案中显示的方式使用它,或者通过接受 ViewModelStoreOwner 的任何其他方式使用它。在这一行中:

val viewModel = ViewModelProvider(myApp, viewModelFactory).get(CustomViewModel::class.java)

您将从您的 Fragment 中获取 myApp 作为:

val myApp = requireContext().application as MyApp

就我个人而言,我认为您指出的解决方案风险很大。 ViewModelStore 在进程的整个生命周期内都存在,永远不会被清除。您最终会在所有内容上共享您的 View 模型,并且该 View 模型所做的所有内容都会泄露。创建自定义 ViewModelStoreOwner 的概念很好,但您应该做一些事情将该所有者的范围与其存储的 View 模型的相关生命周期联系起来。答案试图在最后一段中绕过它;太多的开发人员会忽略这一点并遇到问题。

One way recommended was using a parent Fragment as scope, but that is only possible if there is a parent fragment. It can be just different Fragments.

那么,您的应用并未以“开箱即用”的方式编写自动 ViewModelStoreOwner 管理。

最后,您正在寻找要在这两个 fragment 之间共享的 ViewModelStoreOwner。在您的第一个解决方案中,您试图通过使用其中一个 fragment 中的 ViewModelStoreOwner 来破解它,这只有在您可以可靠地选择哪个 fragment 时才有效。在您在另一个答案中指出的解决方案中,您正试图通过故意泄漏 ViewModelStoreOwner 来破解它。

您可能还可以考虑其他方法,具体取决于您的情况。例如,您的依赖倒置框架(Dagger/Hilt、Koin 等)可能有一些选项可以装配一个 ViewModelStoreOwner 绑定(bind)到特定的 fragment 实例对。

关于android - 如何在一组特定 fragment 之间共享 ViewModel 范围,而不使用 NavGraphs 或将其范围限定到 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67544852/

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