一、Hilt 是什么?
来自官网的解释
Hilt 是 Android 颇具特色的依赖项注入库,可减少在项目中使用手动依赖项注入时产生的样板代码。手动依赖项注入要求您手动构造每个类及其依赖项,并借助容器来重复使用和管理依赖项。
Hilt 通过为项目中的每个 Android 组件提供容器并自动为您管理容器生命周期,提供了一种在应用中执行依赖项注入的标准方法。这通过利用热门依赖项注入库 Dagger 实现。
二、Hilt能给我们带来什么?
运行如下 demo
1.clone 下面这个项目 并执行build
$ git clone -b solution https://github.com/googlecodelabs/android-hilt
2. 找到 MainActivity.kt 文件
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var navigator: AppNavigator
override fun onCreate(savedInstanceState: Bundle?) {
...
if (savedInstanceState == null) {
navigator.navigateTo(Screens.BUTTONS)
}
}
...
}
Q1 :navigator对象并没有被赋值,为什么执行navigator.navigateTo(Screens.BUTTONS)方法却没有报错?
这就是 Hilt 帮我们做的事,点击navigator对象会发现,APT(or KAPT)帮我们生成了相关的代码 MainActivity_MembersInjector.java
public void injectMembers(MainActivity instance) {
injectNavigator(instance, navigatorProvider.get());
}
将@Inject 修饰的对象进行了赋值
Q2 : navigator 对象声明 AppNavigator 是一个 interface 类型,并不是 class 类型。Hilt 也可以返回 object?
事实上,MainActivity 的navigator是 AppNavigatorImpl 对象,在 AppNavigatorImpl 有具体的方法实现,同时需要创建NavigationModule 告诉需要返回 AppNavigator 类型对象时,bindNavigator(impl: AppNavigatorImpl) 返回 AppNavigator。
Hilt 并不是为了实现具体的业务功能,甚至有时使用上比原本直接创建对象编写了更多的代码、APT创建更多的文件。它解决较大项目项目易存在的问题 一 高耦合度
三、Hilt 如何集成?
- gradle 添加相应依赖(建议和官方 demo 一致)
project 级 build.gradle
buildscript >> dependencies >>
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
module 级 build.gradle
dependencies >>
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
自定义Application继承Application,使用@HiltAndroidApp注解,并在AndroidManifest 声明
根据需要添加注解(如 @AndroidEntryPoint ,@Inject)
四、Hilt可能遇到的问题?
编译期 -
Check that your Kotlin version is >= 1.0
检查 Kotlin 版本 project 和 module 是否都指定了 Kotlin。运行期 - @Inject 的对象仍没有赋值 导致调用该对象后报错
可能是哪里配置不匹配导致,遇到过一次,将kotlin_version 和hilt_version 调整和官方一致后,解决了该问题。