將 Hilt 與其他 Jetpack 程式庫搭配使用

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 加註的活動或片段就能使用 ViewModelProviderby 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 或未限定範圍的繫結。此外,您也必須使用 @AssistedContextWorkerParameters 依附元件加註:

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();
  }
}