4. 【浅入深出理解 dagger、Hilt】 - Hilt

在之前的文章就已经介绍了依赖注入的作用。也说过Hilt是由dagger更加优化并且适合Android的一个依赖注入库。那我们直接看看如何使用吧!

让我们直接开始无参依赖注入

1. 在Project的build.gradle添加引入
    dependencies {
        ...
        classpath "com.google.dagger:hilt-android-gradle-plugin:2.36"
    }
2. 在module的build.gradle分别两处地方添加
plugins {
    ...
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}
dependencies {
    ……

    implementation "com.google.dagger:hilt-android:2.37"
    kapt "com.google.dagger:hilt-android-compiler:2.37"
}

好了!添加相关插件自动下载后,我们继续!

3. HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application()

跟dagger有点不一样的是,必须包含一个带有 @HiltAndroidApp标记的Application类。
当然,别忘记修改AndroidManifest.xml


4. 依然使用 @Inject 标记相关需要new的类
class MainEntity @Inject constructor() {
    var name: String = ""
}
5. @AndroidEntryPoint 在Activity使用实体类

请注意,这里已经没有dagger的Component,这也算是体现出Hilt的精简的一个地方,但是我们仍然需要一个标记@AndroidEntryPoint表示该Activity会注入一些对象

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var mainEntity: MainEntity

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        mainEntity.name = "名称"
        binding.tvName.append(mainEntity.name)
    }
}

那如果是有参数的构造函数如何依赖注入呢

简单来说我们用到Hilt的工厂概念,通过传递不同的函数,返回相应的实体,那么我们直接开始吧!

1. 创建实体,使用 @AssistedInject标记构造函数 和 @Assisted标记参数
class MainEntity @AssistedInject constructor(@Assisted var name: String)
2. 创建工厂,使用 @AssistedFactory标记工厂接口
@AssistedFactory
interface MainFactory {
    fun create(name: String): MainEntity
}
3.最后在Activity使用
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var mainFactory: MainFactory
    lateinit var mainEntity: MainEntity

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        mainEntity = mainFactory.create("名称")
        binding.tvName.append(mainEntity.name)
    }
}

那如果同个构造函数里面的参数有多个相同呢?

其实很简单,通过@Assisted("key")不同的key来区分即可

class MainEntity @AssistedInject constructor(@Assisted("name") var name: String,@Assisted("area") var area: String)
@AssistedFactory
interface MainFactory {
    fun create(@Assisted("name") name: String, @Assisted("area") area: String): MainEntity
}

那么这篇文章就结束了,我已经在项目开始使用了Hilt,如果后续有新的发现会陆续更新该文章,欢迎star。谢谢!

只是简单介绍依赖注入使用方式的实例源码如下:
zhongjhATC/HiltAndDaggerDemo: 演示 Hilt、Dagger 的demo (github.com)

其他相关文章
1. 【浅入深出理解 dagger、Hilt】 - 简介 - (jianshu.com)
2. 【浅入深出理解 dagger、Hilt】 - dagger无参依赖注入 - (jianshu.com)
3. 【浅入深出理解 dagger、Hilt】 - dagger有参依赖注入 - (jianshu.com)
4. 【浅入深出理解 dagger、Hilt】 - Hilt - (jianshu.com)

你可能感兴趣的:(4. 【浅入深出理解 dagger、Hilt】 - Hilt)