Hilt:为什么是 ActivityRetainedScoped 与 ViewModelScoped

FRR*_*FRR 8 android dagger-2 dagger-hilt

我试图理解为什么ActivityRetainedScoped在希尔特引入 DI。在我看来,范围与ViewModelScoped应该做的事情是相同的。我的印象是作用域是这样工作的:

AppScope (singleton) > ViewModelScope > ActivityScope > ViewScope > ...

这张图有点暗示 ViewModel 和 Activity 范围是......兄弟姐妹?

根据文档:

“ActivityRetainedComponent 存在于配置更改中,因此它在第一个 Activity#onCreate() 处创建,并在最后一个 Activity#onDestroy() 处销毁。”

嗯,视图模型也是如此,不是吗?我非常确定视图模型可以在配置更改中幸存下来(如果首先将它们放在首位,这就是重点)

什么是ActivityRetainedScoped?它与 VM 范围有何不同?为什么谷歌喜欢将概念上应该简单的事情复杂化

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

And*_*rew 14

好吧,尽管 ActivityRetainedScope 和 ViewModelScope 是兄弟姐妹,人们可能认为这使它们相同,但事实上并非如此。

嗯,视图模型也是如此,不是吗?我非常确定视图模型可以在配置更改中幸存下来(如果首先将它们放在首位,这就是重点)

是的,但实际上不是。Viewmodel 确实可以在配置更改后幸存下来,但仅限于其范围内的生命周期所有者。那么让我们考虑以下场景:

您有两个依赖项,一个是ActivtyRetainedScoped,另一个是viewmodelscoped.

当您现在将 viewmodeldependency 注入 viewmodel 且 viewmodel 的生命周期所有者是一个活动时,那么您是对的,ActivtyRetainedScope 和 ViewmodelScope 都不会产生任何区别。

但现在让我们假设生命周期所有者是一个片段,在这种情况下,当您导航出片段时,viewmodelscoped 依赖项将“死亡”,并且 activtyretainedscope 依赖项将比 viewmodelscoped 依赖项寿命更长。

我希望我能解释它们之间的区别。当英语不是你的母语时,这些“范围”等有点困难。另外,如果这是正确答案,我也不是100%