
DI (依賴項注入) 是一種在程序設(shè)計中被廣泛使用的技術(shù),非常適合 Android 開發(fā),該技術(shù)可以將依賴項提供給類,從而讓類不必自己創(chuàng)建這些依賴。通過遵循 DI 原則,您將為良好的應(yīng)用架構(gòu)、更高的代碼復(fù)用性和便捷的測試奠定基礎(chǔ)。您是否嘗試過在應(yīng)用中進(jìn)行手動依賴項注入?即使使用了當(dāng)今許多現(xiàn)有的依賴項注入庫,隨著您的項目越來越大,這些庫仍需要大量模板代碼,因為您必須手動構(gòu)造每個類及其依賴項,并創(chuàng)建容器用來復(fù)用和管理依賴項。
通過遵循 DI 原則,您將為良好的應(yīng)用架構(gòu)、更高的代碼復(fù)用性和便捷的測試奠定基礎(chǔ)。
通過為項目中的每個 Android 類提供容器并自動管理其生命周期,新的 Hilt 庫 定義了一種在應(yīng)用中進(jìn)行 DI 的標(biāo)準(zhǔn)方式。Hilt 目前處于 alpha 階段,請在您的應(yīng)用中進(jìn)行嘗試,并向我們 提供反饋。
Hilt 在熱門 DI 庫 Dagger 的基礎(chǔ)上構(gòu)建而成,因而能夠受益于 Dagger 的編譯時正確性、運(yùn)行時性能、可伸縮性和 Android Studio 支持。如需了解詳情,請參閱《Dagger 導(dǎo)航從未如此簡單 | Android Studio 4.1》。正因如此,在 Google Play 商店前 10k 的頂級應(yīng)用中,其中 74% 都廣泛使用了 Dagger。但是,由于在編譯期生成代碼,構(gòu)建時間會有所增加。
由于許多 Android Framework 中的類都是由操作系統(tǒng)自身實例化的,因此在 Android 應(yīng)用中使用 Dagger 時,會存在與此相關(guān)的模板代碼。不同于 Dagger,Hilt 集成了 Jetpack 庫以及 Android Framework 中的類,并移除了大部分模板代碼,使您可以專注于定義和注入綁定中的重要環(huán)節(jié),而無需擔(dān)心管理 Dagger 的配置和關(guān)聯(lián)。Hilt 可以自動生成并提供如下內(nèi)容:
- 用于集成 Android Framework 類與 Dagger 的組件,避免了手動創(chuàng)建
- Hilt 自動生成組件的作用域注解
- 預(yù)定義的綁定以及限定符
最重要的是,由于 Dagger 和 Hilt 可以共存,您可以根據(jù)需要遷移應(yīng)用。
Hilt 實戰(zhàn)
為了向您展示 Hilt 的易用性,我們將通過一個典型的 Android 應(yīng)用來演示一些快速 DI。讓我們使用 Hilt 將 AnalyticsAdapter 注入到 MainActivity 中。
首先,在您的 Application 類上添加 @HiltAndroidApp 注解,從而使您的應(yīng)用開啟 Hilt,觸發(fā) Hilt 的代碼生成:
@HiltAndroidApp
class MyApplication : Application() { ... }
其次,通過使用 @Inject 注解修飾 AnalyticsAdapter 的構(gòu)造函數(shù),注明 Hilt 如何提供其實例:
class AnalyticsAdapter @Inject constructor() { ... }
第三,為了將 AnalyticsAdapter 實例注入到 MainActivity 中,需要為 Activity 添加 @AndroidEntryPoint 注解以啟用 Hilt,并通過 @Inject 注解修飾字段執(zhí)行注入:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// analytics 實例已經(jīng)通過 Hilt 賦值,并且可以使用
}
}
更多信息,請在文末備忘單中輕松查看新注解的功能。
對 Jetpack 的支持
您可以通過 Hilt 輕松使用您喜歡的 Jetpack 庫。在此版本中,我們支持 ViewModel 和 WorkManager 直接注入。
舉個例子,向 LoginActivity 中注入一個 組件架構(gòu) ViewMode —— LoginViewModelm: 給 LoginViewModel 增加 @ViewModelInject 注解,然后就可以如您所愿在 Activity 或 Fragment 中使用。
class LoginViewModel @ViewModelInject constructor(
private val analyticsAdapter: AnalyticsAdapter
): ViewModel { ... }
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
private val loginViewModel: LoginViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// loginViewModel 已經(jīng)可以被使用
}
}
了解有關(guān) Jetpack 支持的更多信息,請查閱: Android 官方文檔|Hilt 和 Jetpack 集成
開始使用 Hilt
如果您已經(jīng)對 Hilt 感興趣,并希望了解更多信息,我們整理了如下指南幫您了解如何 將 Hilt 添加到您的 Android 應(yīng)用
文檔
如果您對 DI 或 Dagger 還有些陌生,請查看上面的指南,將 Hilt 添加到 Android 應(yīng)用。如果您已經(jīng)了解 Dagger,請查看 dagger.dev/hilt 內(nèi)提供的文檔。如果您僅想了解新注解以及可以通過 Hilt 做什么,請您查看并收藏文末的備忘單。
面向 Dagger 使用者
如果您已經(jīng)在應(yīng)用中使用 Dagger 或者 dagger.android,查看 遷移指南 或者下文提及的 Codelab 可以幫助您切換到 Hilt。由于 Dagger 和 Hilt 可以共存,您可以逐步遷移您的應(yīng)用。
Codelab
我們發(fā)布了如下兩個 Codelab,手把手教您使用 Hilt:
示例代碼
您是否想在現(xiàn)存應(yīng)用中查看如何使用 Hilt?請查閱以下資源:
反饋
Hilt 目前處于 1.0.0-beta01 版本,如果您在使用中出現(xiàn)任何問題,請及時向我們 反饋問題。
備忘單
該 備忘單 可以讓您快速查看 Hilt 和 Dagger 注解的功能差異以及如何使用它們。