Hilt 中的擴充功能可提供來自其他 Jetpack 程式庫的類別。Hilt 目前支援下列 Jetpack 元件:
ViewModel
- Navigation
- Compose
- WorkManager
您必須新增 Hilt 依附元件,才能使用這些整合功能。如要進一步瞭解如何新增依附元件,請參閱「使用 Hilt 插入依附元件」。
使用 Hilt 插入 ViewModel 物件
如要提供 ViewModel
請透過 @HiltViewModel
為其加註,並在 ViewModel
物件的建構函式中使用 @Inject
註解。
Kotlin
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Java
@HiltViewModel public class ExampleViewModel extends ViewModel { private final ExampleRepository repository; private final SavedStateHandle savedStateHandle; @Inject ExampleViewModel( SavedStateHandle savedStateHandle, ExampleRepository repository) { this.savedStateHandle = savedStateHandle; this.repository = repository; } ... }
這麼一來,以 @AndroidEntryPoint
加註的活動或片段就能使用 ViewModelProvider
或 by viewModels()
KTX 擴充功能,照常取得 ViewModel
執行個體:
Kotlin
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Java
@AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { private ExampleViewModel exampleViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); exampleViewModel = new ViewModelProvider(this).get(ExampleViewModel.class); } ... }
@ViewModelScoped
所有 Hilt ViewModel 都是由 ViewModelComponent
提供,其生命週期與 ViewModel
相同,因此在設定變更後仍然有效。如要將依附元件範圍限制為 ViewModel
,請使用 @ViewModelScoped
註解。
使用 @ViewModelScoped
類型後,系統會在插入 ViewModel
的所有依附元件中提供限定範圍類型的單一執行個體。至於要求限定範圍執行個體的其他 ViewModel 執行個體,則會接收到不同的執行個體。
如果不同的 ViewModel 需共用單一執行個體,請使用 @ActivityRetainedScoped
或 @Singleton
設定範圍。
與 Jetpack 導覽程式庫整合
請將以下額外依附元件新增至 Gradle 檔案中:
app/build.gradle
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
如果 ViewModel
範圍限定在導覽圖,請使用 hiltNavGraphViewModels
函式,這可與帶有 @AndroidEntryPoint
註解的片段併用。
Kotlin
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
Java
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph); ExampleViewModel exampleViewModel = new ViewModelProvider( backStackEntry, HiltViewModelFactory.create(context, backStackEntry) ).get(ExampleViewModel.class)
與 Jetpack Compose 整合
如需瞭解 Hilt 如何與 Jetpack Compose 整合,請參閱「Compose 及其他程式庫」的「Hilt」章節。
使用 Hilt 插入 WorkManager
請將以下額外依附元件新增至 Gradle 檔案中。提醒您,除了程式庫之外,您還需加入以 Hilt 註解處理工具為基礎的其他註解處理工具:
app/build.gradle
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. kapt 'androidx.hilt:hilt-compiler:1.0.0' // When using Java. annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0' }
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. kapt("androidx.hilt:hilt-compiler:1.0.0") // When using Java. annotationProcessor("androidx.hilt:hilt-compiler:1.0.0") }
插入 Worker
,方法是使用類別中的 @HiltWorker
註解,並在 Worker
物件的建構函式中使用 @AssistedInject
。在 Worker
物件中,您只能使用 @Singleton
或未限定範圍的繫結。此外,您也必須使用 @Assisted
為 Context
和 WorkerParameters
依附元件加註:
Kotlin
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Java
@HiltWorker public class ExampleWorker extends Worker { private final WorkerDependency workerDependency; @AssistedInject ExampleWorker( @Assisted @NonNull Context context, @Assisted @NonNull WorkerParameters params, WorkerDependency workerDependency ) { super(context, params); this.workerDependency = workerDependency; } ... }
接著,讓 Application
類別實作 Configuration.Provider
介面,插入 HiltWorkFactory
的執行個體,並將其傳遞至 WorkManager
設定中,如下所示:
Kotlin
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }
Java
@HiltAndroidApp public class ExampleApplication extends Application implements Configuration.Provider { @Inject HiltWorkerFactory workerFactory; @Override public Configuration getWorkManagerConfiguration() { return new Configuration.Builder() .setWorkerFactory(workerFactory) .build(); } }