为什么在 Android Hilt 中使用不同的范围,如果所有范围都可以与 SingletonComponent 一起使用

Why using different scopes with Android Hilt if all can work with SingletonComponent

要添加 Hilt 模块,您需要执行以下操作:

@Module
@InstallIn(SingletonComponent::class)
abstract class MyModule{
...
}

有不同的范围,例如 ActivityComponent、ViewModelComponent 等,但我不清楚何时需要使用不同于 SingletonComponent 的范围,毕竟这涵盖了所有内容并且始终有效。是否只是遵循封装的良好做法的问题?

这是因为注入对象的生命周期或范围。例如,如果您设置模块的范围 Fragment,则每次打开该 Fragment 时都会创建该对象的新实例,并且在您的片段被销毁时将有资格被垃圾收集。您不会在内存中拥有不再需要的对象,有时您可能需要重置其参数的对象的新实例,而不是拥有 Singleton 对象。

它归结为您的依赖项的用例。范围是一种限制图形中对象生命周期的方法。一些用例要求您的对象在其容器(组件)存在时存在。话虽这么说,限制对象生命周期也是有益的 memory-wise,为什么要将一个对象保留在 ApplicationComponent 中,它会在整个应用程序生命周期中存在,但您只在应用程序的后期才需要它,比方说稍后显示的片段。

有些用例要求您在每次显示特定屏幕时都拥有对象的新实例,以便获得正确的状态。