在 Android 中經過 Hilt 進行依賴項注入

DI (依賴項注入) 是一種在程序設計中被普遍使用的技術,很是適合 Android 開發,該技術能夠將依賴項提供給類,從而讓類沒必要本身建立這些依賴。經過遵循 DI 原則,您將爲良好的應用架構、更高的代碼複用性和便捷的測試奠基基礎。您是否嘗試過在應用中進行手動依賴項注入?即便使用了當今許多現有的依賴項注入庫,隨着您的項目愈來愈大,這些庫仍須要大量模板代碼,由於您必須手動構造每一個類及其依賴項,並建立容器用來複用和管理依賴項。android

經過遵循 DI 原則,您將爲良好的應用架構、更高的代碼複用性和便捷的測試奠基基礎。ios

經過爲項目中的每一個 Android 類提供容器並自動管理其生命週期,新的 Hilt 庫 定義了一種在應用中進行 DI 的標準方式。Hilt 目前處於 alpha 階段,請在您的應用中進行嘗試,並向咱們 提供反饋git

Hilt 在熱門 DI 庫 Dagger 的基礎上構建而成,於是可以受益於 Dagger 的編譯時正確性、運行時性能、可伸縮性和 Android Studio 支持。如需瞭解詳情,請參閱《Dagger 導航從未如此簡單 | Android Studio 4.1》。正因如此,在 Google Play 商店前 10k 的頂級應用中,其中 74% 都普遍使用了 Dagger。可是,因爲在編譯期生成代碼,構建時間會有所增長。github

因爲許多 Android Framework 中的類都是由操做系統自身實例化的,所以在 Android 應用中使用 Dagger 時,會存在與此相關的模板代碼。不一樣於 Dagger,Hilt 集成了 Jetpack 庫以及 Android Framework 中的類,並移除了大部分模板代碼,使您能夠專一於定義和注入綁定中的重要環節,而無需擔憂管理 Dagger 的配置和關聯。Hilt 能夠自動生成並提供以下內容:架構

  • 用於集成 Android Framework 類與 Dagger 的組件,避免了手動建立
  • Hilt 自動生成組件的做用域註解
  • 預約義的綁定以及限定符

最重要的是,因爲 Dagger 和 Hilt 能夠共存,您能夠根據須要遷移應用。ide

Hilt 實戰

爲了向您展現 Hilt 的易用性,咱們將經過一個典型的 Android 應用來演示一些快速 DI。讓咱們使用 Hilt 將 AnalyticsAdapter 注入到 MainActivity 中。函數

首先,在您的 Application 類上添加 @HiltAndroidApp 註解,從而使您的應用開啓 Hilt,觸發 Hilt 的代碼生成:性能

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

其次,經過使用 @Inject 註解修飾 AnalyticsAdapter 的構造函數,註明 Hilt 如何提供其實例:測試

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

第三,爲了將 AnalyticsAdapter 實例注入到 MainActivity 中,須要爲 Activity 添加 @AndroidEntryPoint 註解以啓用 Hilt,並經過 @Inject 註解修飾字段執行注入:ui

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
  @Inject lateinit var analytics: AnalyticsAdapter
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // analytics 實例已經經過 Hilt 賦值,而且可使用
  }
}

更多信息,請在文末備忘單中輕鬆查看新註解的功能。

對 Jetpack 的支持

您能夠經過 Hilt 輕鬆使用您喜歡的 Jetpack 庫。在此版本中,咱們支持 ViewModel 和 WorkManager 直接注入。

舉個例子,向 LoginActivity 中注入一個 組件架構 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 已經能夠被使用
  }
}

瞭解有關 Jetpack 支持的更多信息,請查閱: Android 官方文檔|Hilt 和 Jetpack 集成

開始使用 Hilt

若是您已經對 Hilt 感興趣,並但願瞭解更多信息,咱們整理了以下指南幫您瞭解如何 將 Hilt 添加到您的 Android 應用

文檔

若是您對 DI 或 Dagger 還有些陌生,請查看上面的指南,將 Hilt 添加到 Android 應用。若是您已經瞭解 Dagger,請查看 dagger.dev/hilt 內提供的文檔。若是您僅想了解新註解以及能夠經過 Hilt 作什麼,請您查看並收藏文末的備忘單。

面向 Dagger 使用者

若是您已經在應用中使用 Dagger 或者 dagger.android,查看 遷移指南 或者下文說起的 Codelab 能夠幫助您切換到 Hilt。因爲 Dagger 和 Hilt 能夠共存,您能夠逐步遷移您的應用。

Codelab

咱們發佈了以下兩個 Codelab,手把手教您使用 Hilt:

示例代碼

您是否想在現存應用中查看如何使用 Hilt?請查閱如下資源:

反饋

Hilt 目前處於 1.0.0-beta01 版本,若是您在使用中出現任何問題,請及時向咱們 反饋問題

備忘單

備忘單 可讓您快速查看 Hilt 和 Dagger 註解的功能差別以及如何使用它們。

相關文章
相關標籤/搜索