記一次 Hilt 學(xué)習(xí)

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

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

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

四、Hilt可能遇到的問(wèn)題?

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

  2. 運(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)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容