一、Hilt 是什么?
來(lái)自官網(wǎng)的解釋
Hilt 是 Android 頗具特色的依賴項(xiàng)注入庫(kù),可減少在項(xiàng)目中使用手動(dòng)依賴項(xiàng)注入時(shí)產(chǎn)生的樣板代碼。手動(dòng)依賴項(xiàng)注入要求您手動(dòng)構(gòu)造每個(gè)類及其依賴項(xiàng),并借助容器來(lái)重復(fù)使用和管理依賴項(xiàng)。
Hilt 通過(guò)為項(xiàng)目中的每個(gè) Android 組件提供容器并自動(dòng)為您管理容器生命周期,提供了一種在應(yīng)用中執(zhí)行依賴項(xiàng)注入的標(biāo)準(zhǔn)方法。這通過(guò)利用熱門依賴項(xiàng)注入庫(kù) Dagger 實(shí)現(xiàn)。
二、Hilt能給我們帶來(lái)什么?
運(yùn)行如下 demo
1.clone 下面這個(gè)項(xiàng)目 并執(zhí)行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對(duì)象并沒(méi)有被賦值,為什么執(zhí)行navigator.navigateTo(Screens.BUTTONS)方法卻沒(méi)有報(bào)錯(cuò)?
這就是 Hilt 幫我們做的事,點(diǎn)擊navigator對(duì)象會(huì)發(fā)現(xiàn),APT(or KAPT)幫我們生成了相關(guān)的代碼 MainActivity_MembersInjector.java
public void injectMembers(MainActivity instance) {
injectNavigator(instance, navigatorProvider.get());
}
將@Inject 修飾的對(duì)象進(jìn)行了賦值
Q2 : navigator 對(duì)象聲明 AppNavigator 是一個(gè) interface 類型,并不是 class 類型。Hilt 也可以返回 object?
事實(shí)上,MainActivity 的navigator是 AppNavigatorImpl 對(duì)象,在 AppNavigatorImpl 有具體的方法實(shí)現(xiàn),同時(shí)需要?jiǎng)?chuàng)建NavigationModule 告訴需要返回 AppNavigator 類型對(duì)象時(shí),bindNavigator(impl: AppNavigatorImpl) 返回 AppNavigator。
Hilt 并不是為了實(shí)現(xiàn)具體的業(yè)務(wù)功能,甚至有時(shí)使用上比原本直接創(chuàng)建對(duì)象編寫了更多的代碼、APT創(chuàng)建更多的文件。它解決較大項(xiàng)目項(xiàng)目易存在的問(wèn)題 一 高耦合度
三、Hilt 如何集成?
- gradle 添加相應(yīng)依賴(建議和官方 demo 一致)
project 級(jí) build.gradle
buildscript >> dependencies >>
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
module 級(jí) build.gradle
dependencies >>
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
自定義Application繼承Application,使用@HiltAndroidApp注解,并在AndroidManifest 聲明
根據(jù)需要添加注解(如 @AndroidEntryPoint ,@Inject)
四、Hilt可能遇到的問(wèn)題?
編譯期 -
Check that your Kotlin version is >= 1.0
檢查 Kotlin 版本 project 和 module 是否都指定了 Kotlin。運(yùn)行期 - @Inject 的對(duì)象仍沒(méi)有賦值 導(dǎo)致調(diào)用該對(duì)象后報(bào)錯(cuò)
可能是哪里配置不匹配導(dǎo)致,遇到過(guò)一次,將kotlin_version 和hilt_version 調(diào)整和官方一致后,解決了該問(wèn)題。