Hilt 包含提供其他 Jetpack 程式庫類別的擴充功能。 Hilt 目前支援下列 Jetpack 元件:
ViewModel
- Navigation
- Compose
- WorkManager
必須新增 Hilt 依附元件,才能使用這些整合功能。如要進一步瞭解如何新增依附元件,請參閱「使用 Hilt 插入依附元件」。
使用 Hilt 插入 ViewModel 物件
為提供 ViewModel
請透過 @HiltViewModel
為其註解,並使用 @Inject
註解於 ViewModel
物件的建構函式。
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
的活動或片段就能取得 ViewModel
執行個體如同照常使用 ViewModelProvider
或 by viewModels()
KTX 擴充功能:
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
範圍限定在導覽圖,請使用帶有 @AndroidEntryPoint
註解的片段的 hiltNavGraphViewModels
函式。
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") }
使用類別中的 @HiltWorker
註解和 Worker
物件的建構函式中的 @AssistedInject
來插入 Worker
。在 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(); } }