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 Navigation 程式庫整合
將以下額外依附元件新增至 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 註解處理工具上層運作的額外註解處理工具:
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(); } }