在之前的文章就已經(jīng)介紹了依賴注入的作用擂煞。也說過Hilt是由dagger更加優(yōu)化并且適合Android的一個(gè)依賴注入庫(kù)。那我們直接看看如何使用吧趴乡!
讓我們直接開始無參依賴注入
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"
}
好了对省!添加相關(guān)插件自動(dòng)下載后,我們繼續(xù)晾捏!
3. HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application()
跟dagger有點(diǎn)不一樣的是蒿涎,必須包含一個(gè)帶有 @HiltAndroidApp標(biāo)記的Application類。
當(dāng)然惦辛,別忘記修改AndroidManifest.xml
<application
android:allowBackup="true"
android:name=".MyApplication"
...
</application>
4. 依然使用 @Inject 標(biāo)記相關(guān)需要new的類
class MainEntity @Inject constructor() {
var name: String = ""
}
5. @AndroidEntryPoint 在Activity使用實(shí)體類
請(qǐng)注意劳秋,這里已經(jīng)沒有dagger的Component,這也算是體現(xiàn)出Hilt的精簡(jiǎn)的一個(gè)地方,但是我們?nèi)匀恍枰粋€(gè)標(biāo)記@AndroidEntryPoint
表示該Activity會(huì)注入一些對(duì)象
@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)
}
}
那如果是有參數(shù)的構(gòu)造函數(shù)如何依賴注入呢
簡(jiǎn)單來說我們用到Hilt的工廠概念玻淑,通過傳遞不同的函數(shù)嗽冒,返回相應(yīng)的實(shí)體,那么我們直接開始吧补履!
1. 創(chuàng)建實(shí)體添坊,使用 @AssistedInject標(biāo)記構(gòu)造函數(shù) 和 @Assisted標(biāo)記參數(shù)
class MainEntity @AssistedInject constructor(@Assisted var name: String)
2. 創(chuàng)建工廠,使用 @AssistedFactory標(biāo)記工廠接口
@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)
}
}
那如果同個(gè)構(gòu)造函數(shù)里面的參數(shù)有多個(gè)相同呢箫锤?
其實(shí)很簡(jiǎn)單贬蛙,通過@Assisted("key")不同的key來區(qū)分即可
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
}
那么這篇文章就結(jié)束了,我已經(jīng)在項(xiàng)目開始使用了Hilt谚攒,如果后續(xù)有新的發(fā)現(xiàn)會(huì)陸續(xù)更新該文章阳准,歡迎star。謝謝馏臭!
只是簡(jiǎn)單介紹依賴注入使用方式的實(shí)例源碼如下:
zhongjhATC/HiltAndDaggerDemo: 演示 Hilt野蝇、Dagger 的demo (github.com)
其他相關(guān)文章
1. 【淺入深出理解 dagger、Hilt】 - 簡(jiǎn)介 - 簡(jiǎn)書 (jianshu.com)
2. 【淺入深出理解 dagger位喂、Hilt】 - dagger無參依賴注入 - 簡(jiǎn)書 (jianshu.com)
3. 【淺入深出理解 dagger浪耘、Hilt】 - dagger有參依賴注入 - 簡(jiǎn)書 (jianshu.com)
4. 【淺入深出理解 dagger、Hilt】 - Hilt - 簡(jiǎn)書 (jianshu.com)