在 Android 中通過 Hilt 進(jìn)行依賴項注入

image

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 注解的功能差異以及如何使用它們。

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

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

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