在 Android 中依賴注入,使用 Hilt

本文為 Manuel Vivo 發(fā)布于 Medium 的文章譯文
原文鏈接為 Dependency injection on Android with Hilt
本文僅作為個(gè)人學(xué)習(xí)記錄所用。如有涉及侵權(quán),請(qǐng)相關(guān)人士盡快聯(lián)系譯文作者。

依賴注入(DI)是一種在編程中廣泛使用的技術(shù),非常適合 Android 開發(fā)。在 Android 開發(fā)中,將依賴項(xiàng)提供給類,而不是自己創(chuàng)建依賴項(xiàng)。 通過遵循 DI 原則,您將為良好的應(yīng)用程序體系結(jié)構(gòu),更高的代碼可重用性和易于測(cè)試奠定基礎(chǔ)。 您是否曾經(jīng)嘗試過在應(yīng)用程序中進(jìn)行手動(dòng)依賴項(xiàng)注入? 即使使用當(dāng)今許多現(xiàn)有的依賴項(xiàng)注入庫(kù),由于您的項(xiàng)目越來越大,它仍需要大量樣板代碼,因?yàn)槟仨毷謩?dòng)構(gòu)造每個(gè)類及其依賴項(xiàng),并創(chuàng)建容器以重用和管理依賴項(xiàng)。

通過遵循DI原則,您將為良好的應(yīng)用程序體系結(jié)構(gòu),更高的代碼可重用性和易于測(cè)試奠定基礎(chǔ)

通過為項(xiàng)目中的每個(gè)Android類提供容器并為你自動(dòng)管理其生命周期,新的Hilt庫(kù)定義了一種在應(yīng)用程序中執(zhí)行DI的標(biāo)準(zhǔn)方法。Hilt目前處于Alpha狀態(tài),請(qǐng)?jiān)谀膽?yīng)用中進(jìn)行嘗試,并使用此鏈接向我們提供反饋。

Hilt基于流行的DI庫(kù)Dagger構(gòu)建,因此可以從Dagger提供的編譯時(shí)間正確性,運(yùn)行時(shí)性能,可伸縮性和Android Studio支持中受益。 因此,Dagger在Google Play商店的前1萬(wàn)款應(yīng)用中占74%的廣泛采用率。 但是,由于生成了編譯時(shí)代碼,因此預(yù)期編譯時(shí)間會(huì)增加。

由于許多Android框架類都是由操作系統(tǒng)本身實(shí)例化的,因此在Android應(yīng)用中使用Dagger時(shí)會(huì)有一個(gè)關(guān)聯(lián)的樣板。 與Dagger不同,Hilt與Jetpack庫(kù)和Android框架類集成在一起,并刪除了大部分樣板,使您可以專注于定義和注入綁定的重要部分,而不必?fù)?dān)心管理所有Dagger設(shè)置和編寫。 它會(huì)自動(dòng)生成并提供:

  • 用于將Android框架類與Dagger集成的組件,否則需要手工創(chuàng)建。
  • Hilt自動(dòng)生成的組件的范圍注釋。
  • 預(yù)定義的綁定和限定符。

最重要的是,由于Dagger和Hilt可以共存,因此可以根據(jù)需要遷移應(yīng)用程序。

Hilt 在項(xiàng)目中的實(shí)踐

為了向您展示Hilt的易用性,讓我們?cè)诘湫偷腁ndroid應(yīng)用中執(zhí)行一些快速DI。 讓我們用Hilt將AnalyticsAdapter注入MainActivity。
首先,使用@HiltAndroidApp注釋應(yīng)用程序類以觸發(fā)Hilt的代碼生成,從而在您的應(yīng)用程序中啟用Hilt:

@HiltAndroidApp
class MyApplication : Application() { ... }

其次,通過用@Inject注釋其構(gòu)造函數(shù)來告訴Hilt如何提供AnalyticsAdapter的實(shí)例:

class AnalyticsAdapter @Inject constructor() { ... }

第三,要將AnalyticsAdapter的實(shí)例注入MainActivity,請(qǐng)?jiān)诨顒?dòng)中使用@AndroidEntryPoint批注啟用Hilt,并使用@Inject批注執(zhí)行字段注入:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
  @Inject lateinit var analytics: AnalyticsAdapter
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // analytics instance has been populated by Hilt
    // and it's ready to be used
  }
}

有關(guān)更多信息,您可以在下面的備忘單部分中輕松查看新注釋的功能。

附帶Jetpack支持!

您可以在開箱即用的情況下使用喜愛的Jetpack庫(kù)。 在此版本中,我們?yōu)閂iewModel和WorkManager提供直接注入支持。
例如,要將架構(gòu)組件ViewModel,LoginViewModel注入LoginActivity:用@ViewModelInject注釋LoginViewModel并按預(yù)期在activity或fragment中使用它:
文檔中了解有關(guān)Jetpack支持的更多信息。

開始使用Hilt

如果您對(duì)Hilt感興趣,并且想了解更多有關(guān)此的信息,請(qǐng)按照以下偏好的方式學(xué)習(xí)一些資源:

Hilt入門
借助本指南,了解如何在您的Android應(yīng)用中添加Hilt。

文獻(xiàn)資料
如果您是DI或Dagger的新手,請(qǐng)查看我們的指南,將Hilt添加到Android應(yīng)用中。 另外,如果您已經(jīng)了解Dagger,我們還將提供有關(guān)dagger.dev的文檔。
如果您只是對(duì)新的注解以及Hilt的用途感到好奇,請(qǐng)?jiān)谝韵虏糠种胁榭丛搨渫鼏巍?/p>

對(duì)于Dagger用戶
如果您已經(jīng)在應(yīng)用中使用了Dagger或dagger.android,請(qǐng)查看此遷移指南或下面提到的代碼實(shí)驗(yàn)室,以幫助您切換到Hilt。 由于Dagger和Hilt可以共存,因此您可以逐步遷移應(yīng)用程序。

代碼實(shí)驗(yàn)室
為了逐步學(xué)習(xí)Hilt,我們剛剛發(fā)布了兩個(gè)代碼實(shí)驗(yàn)室:

代碼示例
您想查看在現(xiàn)有應(yīng)用中如何使用Hilt嗎? 在Google I / O 2020應(yīng)用程序Android體系結(jié)構(gòu)示例Github存儲(chǔ)庫(kù)的dev-hilt分支中檢查其用法。

反饋
Hilt目前處于Alpha狀態(tài),請(qǐng)?jiān)谀膽?yīng)用中進(jìn)行嘗試,并使用此鏈接向我們提供反饋。

備忘單
該備忘單使您可以快速查看Hilt和Dagger注解的不同功能以及如何使用它們。

cheat-sheet.png

?著作權(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ù)。

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