And*_*Dev 5 android dagger-hilt
在 Android Hilt 中,您可以将 @Singleton 注释应用于如下函数:
@Module
@InstallIn(SingletonComponent::class)
object SomeModule {
@Singleton
@Provides
fun provideSomething(): String {
return "Hi there"
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白在函数上使用单例的目的是什么。具有@Singleton的类意味着该类的实例仅存在一次。但你不能创建函数的实例,所以我不明白这一点。
@Singleton称为 Scope,默认情况下,Hilt 中的所有绑定都是无作用域的。这意味着每次您的应用程序请求绑定时,Hilt 都会创建所需类型的新实例。例如,在您的情况下,每次请求字符串时,都会创建一个新字符串。
但是,当您添加@Singleton注释时,您说该实例的范围是单例的,因此每次请求字符串时它将提供相同的实例。
SingletonComponent与哪个组件不同,它决定您可以在哪里使用该模块,因此,如果您将其更改为ViewModelComponent,您将只能使用该模块ViewModel,并且它的生命周期将与 ViewModel 生命周期相关。
您可以在这里查看更多信息:https://developer.android.com/training/dependency-injection/hilt-android# generated-components
看一下这个例子:
尝试提供一些随机数,而不是仅仅提供静态字符串:
@Provides
fun provideString(): String {
return (1..100).random().toString()
}
Run Code Online (Sandbox Code Playgroud)
如果没有,@Singleton当您在应用程序的不同类中注入 String 时,您将得到不同的结果,因为每次 hilt 都会运行函数内的代码,provideString因此它将返回 String 的新实例(这就是我提供新实例的意思)。
现在添加@Singleton:
@Singleton
@Provides
fun provideString(): String {
return (1..100).random().toString()
}
Run Code Online (Sandbox Code Playgroud)
您会注意到,提供的字符串在您的应用程序中是相同的,因此provideString被调用一次并保存结果,因此 hilt 每次都会返回保存的字符串实例。
小智 -1
函数可以像类一样是单例,它将确保只创建一个实例。通常,对同一函数的多次调用将被堆叠起来,并逐一执行,而在单例函数中,最后一次调用将覆盖前一个调用。因此,如果在循环中调用它 10 次,则不会将调用的实例堆叠在其中记忆。
| 归档时间: |
|
| 查看次数: |
3662 次 |
| 最近记录: |