Hilt 內含的擴充功能可提供來自其他 Jetpack 程式庫的類別。Hilt 目前支援下列 Jetpack 元件:
- 撰寫
ViewModel- 導覽
- WorkManager
您必須新增 Hilt 依附元件,才能使用這些整合功能。如要進一步瞭解如何新增依附元件,請參閱「使用 Hilt 插入依附元件」。
與 Jetpack Compose 整合
如要瞭解如何整合 Hilt 與 Jetpack Compose,請參閱「Compose 及其他程式庫」的 Hilt 章節。
使用 Hilt 插入 ViewModel 物件
如要提供 ViewModel,請為其加上 @HiltViewModel 註解,並在 ViewModel 物件的建構函式中使用 @Inject 註解。
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
這麼一來,加上 @AndroidEntryPoint 註解的活動就能使用 ViewModelProvider 或 by viewModels() KTX 擴充功能,照常取得 ViewModel 例項:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
搭配 ViewModel 使用輔助插入
Hilt 支援 ViewModel 的輔助插入功能。輔助插入功能可讓您插入動態執行階段引數,以及 Hilt 管理的依附元件。如要使用輔助插入功能,請為 ViewModel 建構函式加上 @AssistedInject 註解,並以 @Assisted 標記動態參數。您也必須定義 @AssistedFactory 介面,做為 Hilt 的橋接器,自動產生必要的 @ViewModelProvider.Factory。
@HiltViewModel(assistedFactory = MyViewModel.Factory::class) class MyViewModel @AssistedInject constructor( @Assisted val userId: String, private val repository: MyRepository ) : ViewModel() { @AssistedFactory interface Factory { fun create(userId: String): MyViewModel } }
在 Compose 中,您可以在 Navigation 或畫面初始化期間,將輔助工廠傳遞至 hiltViewModel 函式,藉此使用輔助工廠。這種做法可省去手動建立樣板的麻煩,同時確保 ViewModel 正確限定在 Navigation 返回堆疊中。詳情請參閱 Hilt 說明文件中的輔助插入。
@ViewModelScoped
所有 Hilt ViewModel 都是由 ViewModelComponent 提供,其生命週期與 ViewModel 相同,因此可在設定變更後繼續留存。如要將依附元件範圍限定為 ViewModel,請使用 @ViewModelScoped 註解。
使用 @ViewModelScoped 類型後,系統會在插入至 ViewModel 的所有依附元件中提供限定範圍的類型單一例項。要求限定範圍例項的其他 ViewModel 例項,則會接收到不同的例項。
如果不同的 ViewModel 需要共用單一例項,應使用 @ActivityRetainedScoped 或 @Singleton 限定範圍。
與 Jetpack Navigation 程式庫整合
將以下額外依附元件新增至 Gradle 檔案:
app/build.gradle
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0' }
在 Jetpack Compose 中,Navigation Compose 和 Navigation 3 程式庫都會使用 hiltViewModel 函式,自動擷取範圍限定為目前導覽目的地的 ViewModel。
在 Navigation 3 中,導覽目的地是以 NavEntry 表示。使用 rememberViewModelStoreNavEntryDecorator,將 ViewModel 範圍設為 NavEntry。在該 NavEntry 的提供者中使用 hiltViewModel,即可擷取相關聯的 ViewModel。
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
在 Navigation Compose 中,ViewModel 會自動限定為導覽目的地。詳情請參閱「Hilt 和 Navigation」。
val viewModel = hiltViewModel()
使用 Hilt 插入 WorkManager
將以下額外依附元件新增至 Gradle 檔案。請注意,除了程式庫之外,您還需加入在 Hilt 註解處理工具上層運作的額外註解處理工具:
app/build.gradle
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. ksp("androidx.hilt:hilt-compiler:1.3.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.3.0' }
使用類別中的 @HiltWorker 註解,以及 Worker 物件建構函式中的 @AssistedInject,插入 Worker。在 Worker 物件中,您只能使用 @Singleton 或未限定範圍的繫結。此外,您也必須使用 @Assisted 為 Context 和 WorkerParameters 依附元件加上註解:
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
接著,為 Application 類別實作 Configuration.Provider 介面,插入 HiltWorkFactory 的例項,並傳遞至 WorkManager 設定中,如下所示:
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }