帶有Hilt的Android上的依賴注入

Jetpack推薦的DI庫(kù)

依賴項(xiàng)注入(DI)是一種廣泛用于編程的技術(shù),非常適合Android開(kāi)發(fā),該類將依賴項(xiàng)提供給類而不是自己創(chuàng)建。通過(guò)遵循DI原則,您將為良好的應(yīng)用程序體系結(jié)構(gòu),更高的代碼可重用性和易于測(cè)試奠定基礎(chǔ)。

您是否曾經(jīng)嘗試過(guò)在應(yīng)用程序中進(jìn)行手動(dòng)依賴項(xiàng)注入?即使使用當(dāng)今許多現(xiàn)有的依賴項(xiàng)注入庫(kù),由于您的項(xiàng)目越來(lái)越大,它仍需要大量樣板代碼,因?yàn)槟仨毷謩?dòng)構(gòu)造每個(gè)類及其依賴項(xiàng),并創(chuàng)建容器以重用和管理依賴項(xiàng)。

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

通過(guò)為項(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商店的前10k頂級(jí)應(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使用

為了向您展示Hilt的易用性,讓我們?cè)谝粋€(gè)典型的Android應(yīng)用中執(zhí)行一些快速DI。讓我們讓Hilt將一個(gè) AnalyticsAdapter插入我們的MainActivity中。

首先,通過(guò)在應(yīng)用程序類中使用@HiltAndroidApp注釋來(lái)觸發(fā)Hilt的代碼生成,從而在應(yīng)用程序中啟用Hilt:

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

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

@Inject:

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)    // 分析實(shí)例已由Hilt填充
    // and it's ready to be used
  }
}

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

Jetpack支持

在此版本中,提供對(duì)ViewModel和WorkManager的直接注入支持。

例如,要將Architecture Components ViewModel注入到LoginActivity中:用@ViewModelInject注釋LoginViewModel并使用如您所愿,將其放在活動(dòng)或片段中:

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 is ready to be used
  }
}

docs中了解有關(guān)Jetpack支持的更多信息。

開(kāi)始使用Hilt

如果您對(duì)Hilt感興趣,并想進(jìn)一步了解它,可以通過(guò)以下一些資源以自己喜歡的方式學(xué)習(xí)

Hilt入門(mén)

Hilt入門(mén)示例 guide.

相關(guān)資料

如果您不熟悉DI或Dagger,請(qǐng)查看我們的 guide to add Hilt to an Android app. 另外,如果您已經(jīng)知道Dagger,我們還提供 documentation on dagger.dev.

如果您只是對(duì)新注釋以及Hilt的功能感到好奇,請(qǐng)?jiān)谙旅娴牟糠种胁榭丛搨渫鼏巍?/p>

對(duì)于Dagger用戶

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

代碼示例

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

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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