记一次 Hilt 学习

一、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 如何集成?

  1. 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"
  1. 自定义Application继承Application,使用@HiltAndroidApp注解,并在AndroidManifest 声明

  2. 根据需要添加注解(如 @AndroidEntryPoint ,@Inject)

四、Hilt可能遇到的问题?

  1. 编译期 - Check that your Kotlin version is >= 1.0
    检查 Kotlin 版本 project 和 module 是否都指定了 Kotlin。

  2. 运行期 - @Inject 的对象仍没有赋值 导致调用该对象后报错
    可能是哪里配置不匹配导致,遇到过一次,将kotlin_version 和hilt_version 调整和官方一致后,解决了该问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容