一个类,多种注入方式
上述的多种注入方式都存在一个问题,我们只能对一个类注入一种实例,例如OkHttpClient只能存在一种,但是实际项目中可能存在多套Client,亦或者是更常见的String,我们总不能只能注入一个String对象吧,因此我们需要告诉Hilt如何区分它们。
方法一:使用Named注解
非常的简单,只需要在Provides方式的容器的方法中增加一个注解Named,然后写上独一无二的Tag,在使用端同时加上对应的Tag,这样Hilt注入的时候就会选择对应的注入方式,为同一个类型提供多种绑定。
@AndroidEntryPoint class ExampleActivity:AppCompatActivity() { @Inject @Named("One") lateinit var oneString:String @Inject @Named("Two") lateinit var twoString:String } @Module @InstallIn(ActivityComponent::class) object StringModule{ @Provides @Named("One") fun providesOneString():String{ return "One" } @Provides @Named("Two") fun providesTwoString():String{ return "Two" } }
注入接口也是同样的道理,在对应的binds方法中添加Named注解即可,你可以自己动手试试
方法二:自定义注解
首先笔者说下自己的态度,笔者并不喜欢第一种方式是因为Named注解里面的值只能硬编码,由于注解的特性并不能传入一个静态的String,因此容易写错或者后期重构容易遗漏修改导致出现注入失败,因此笔者更喜欢这种方式。
首先根据你需要的分类定义相应的注解,注解都添加@Qualifier(告诉Hilt这个注解是分类器)
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class OneString @Qualifier @Retention(AnnotationRetention.BINARY) annotation class TwoString 其他的部分和Named差不多 kotlin 复制代码 @AndroidEntryPoint class ExampleActivity:AppCompatActivity() { @Inject @OneString lateinit var oneString:String @Inject @TwoString lateinit var twoString:String } @Module @InstallIn(ActivityComponent::class) object StringModule{ @Provides @OneString fun providesOneString():String{ return "One" } @Provides @TwoString fun providesTwoString():String{ return "Two" } }
好了,这篇文章到这里就结束了,下一期我们继续探讨一下Hilt的容器生命周期和容器作用域相关的话题,特别是如何让注入的对象单例化。