Hilt
目前支持注入的 Android
类共有如下 6 种:
Application
(通过使用@HiltAndroidApp
)Activity
Fragment
View
Service
BroadcastReceiver
除 Application
需要 @HiltAndroidApp
修饰外,其他需要依赖注入的类都需要添加 @AndroidEntryPoint
注解。
@AndroidEntryPoint
class MainHiltActivity: AppCompatActivity() {
}
注意:
Hilt
仅支持扩展ComponentActivity
的Activity
,如AppCompatActivity
。Hilt
仅支持扩展androidx.Fragment
的Fragment
。Hilt
不支持保留的Fragment
。
@Inject
接下来就可以通过 @Inject
来执行注入了:
@AndroidEntryPoint
class MainHiltActivity: AppCompatActivity() {
@Inject
lateinit var capBean: CapBean
}
注意:由
Hilt
注入的字段不能为私有字段。
到这里还并不能完成 capBean
字段的注入,这时 Hilt
并不知道如何创建实例对象。需要在构造函数上添加 @Inject
注解。这时 Hilt
就知道如何创建需要注入的实例对象了。
class CapBean @Inject constructor()
同理如果需要注入对象的构造函数中带有参数那么也需要对所需参数的构造函数添加 @Inject
注解。
class CapBean @Inject constructor(val waterBean: WaterBean)
class WaterBean @Inject constructor()
@Module
有些情况无法通过在构造函数中添加 @Inject
注解的方式来告知 Hilt
如何提供该类或接口的实例,比如:
- 接口。
- 来自外部库的类。
可以通过 @Module
注解来完成。@Module
注解会生成 Hilt
模块,在模块中提供具体的实现。
@Binds
注入接口实例,需要通过 @Module + @Binds
注解的方式。
首先定义一个接口:
interface Water {
fun drink()
}</