Hilt: 为什么要使用 ActivityRetainedScoped 而不是 ViewModelScoped?

8

我试图理解为什么在Hilt的DI中引入了ActivityRetainedScoped,感觉这个作用域与ViewModelScoped应该是一样的。我原来的印象是作用域像这样工作:

AppScope(单例)> ViewModelScope > ActivityScope > ViewScope > ...

但是这张图似乎暗示着ViewModel和Activity的作用域是...同级的?

根据文档:

"ActivityRetainedComponent跨配置更改存在,因此它会在第一个Activity#onCreate()创建并在最后一个Activity#onDestroy()销毁。"

嗯,ViewModel也是如此,对吧? 我非常确定ViewModel可以在配置更改后生存下来(这就是它们存在的全部意义)

ActivityRetainedScoped是什么?它与VM范围有何不同?为什么谷歌喜欢让本应概念简单的事情变得复杂起来?

https://developer.android.com/training/dependency-injection/hilt-android

1个回答

14
尽管ActivityRetainedScope和ViewModelScope是兄弟,人们可能会认为它们是相同的,但事实并非如此。
嗯,Viewmodel也是这样吗? 我很确定view model可以在配置更改后继续存在(这是它们存在的首要原因)。
是的,但其实不完全是这样。 Viewmodel确实可以在配置更改后继续存在,但仅限于其作用域生命周期所有者。 因此,让我们考虑以下情况:
您有两个依赖项,一个是ActivtyRetainedScoped,另一个是viewmodelscoped。
当您将viewmodeldependency注入viewmodel中并且viewmodel的lifecycleowner是activity时,您是正确的,ActivtyRetainedScope和ViewmodelScope没有任何区别。
但现在假设lifecycleowner是fragment,在这种情况下,当您导航离开fragment时,viewmodlescoped依赖项将“死亡”,而activtyretainedscope依赖项将超越viewmodelscoped依赖项。
我希望我已经解释清楚了它们之间的区别。 当英语不是您的母语而使用“scopes”等术语时,有些困难。 此外,我不确定这是否是正确的答案。

谢谢!我完全忘记了片段(我像瘟疫一样避免它们)。所以你是说,片段的“viewmodelScope”比活动的“viewModelScope”要小。尽管它们被称为相同的名称。Google确实喜欢毫无理由地使事情过于复杂化。 - frankelot
1
是的,这就是我想说的。是的,谷歌的前三件事情是:过度复杂化、废弃或根本不交付东西。(出于这个原因退出了Android开发) - Andrew
+1,如果他们至少能花时间在文档中澄清这些不确定性,那么我们就不必再猜测了。我的意思是,他们正在引入一个明显值得解释的新的“ActivityRetainedScoped”,但是却没有解释。 - frankelot
很好的解释,非常有帮助!谢谢 - SUPERYAO
是的,@ActivtyRetainedScoped 就像一个共享活动-ViewModel 的 @ViewModelScope,有时非常有用 - 比如当您需要相同的实例在配置更改后继续存在并注入到此活动下面的任何 ViewModel 中时。可以想象一下仓库或中介者模式。 - Alexander Skvortsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接