Hilt 內含的擴充功能可提供來自其他 Jetpack 程式庫的類別。Hilt 目前支援下列 Jetpack 元件:
ViewModel
- Navigation
- Compose
- WorkManager
您必須新增 Hilt 依附元件,才能使用這些整合功能。如要進一步瞭解如何新增依附元件,請參閱「使用 Hilt 插入依附元件」。
使用 Hilt 插入 ViewModel 物件
如要提供 ViewModel
,請為其加上 @HiltViewModel
註解,並在 ViewModel
物件的建構函式中使用 @Inject
註解。
@HiltViewModel
class ExampleViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val repository: ExampleRepository
) : ViewModel() {
...
}
@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
例項:
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
private val exampleViewModel: ExampleViewModel by viewModels()
...
}
@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 檔案:
app/build.gradle
dependencies {
...
implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}
dependencies {
...
implementation("androidx.hilt:hilt-navigation-fragment:1.0.0")
}
如果 ViewModel
的範圍限定在導覽圖,請使用 hiltNavGraphViewModels
函式與帶有 @AndroidEntryPoint
註解的片段搭配運作。
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
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
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'
}
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
依附元件加上註解:
@HiltWorker
class ExampleWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters,
workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }
@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
設定中,如下所示:
@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
@HiltAndroidApp
public class ExampleApplication extends Application implements Configuration.Provider {
@Inject HiltWorkerFactory workerFactory;
@Override
public Configuration getWorkManagerConfiguration() {
return new Configuration.Builder()
.setWorkerFactory(workerFactory)
.build();
}
}