本文為 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注解的不同功能以及如何使用它們。
