在之前的文章就已经介绍了依赖注入的作用。也说过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
<application
android:allowBackup="true"
android:name=".MyApplication"
...
</application>
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)
网友评论