Menggunakan Hilt dengan library Jetpack lainnya

Hilt menyertakan ekstensi untuk menyediakan class dari library Jetpack lainnya. Saat ini, Hilt mendukung komponen Jetpack berikut:

  • ViewModel
  • Navigasi
  • Compose
  • WorkManager

Anda harus menambahkan dependensi Hilt untuk memanfaatkan integrasi ini. Untuk mengetahui informasi selengkapnya tentang menambahkan dependensi, lihat Injeksi dependensi dengan Hilt.

Menginjeksikan objek ViewModel dengan Hilt

Berikan ViewModel dengan menganotasinya menggunakan @HiltViewModel dan menggunakan anotasi @Inject dalam konstruktor objek 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;
  }
  ...
}

Kemudian, aktivitas atau fragmen yang dianotasi dengan @AndroidEntryPoint bisa mendapatkan instance ViewModel seperti biasa menggunakan ekstensi KTX ViewModelProvider atau by viewModels():

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

Semua ViewModel Hilt disediakan oleh ViewModelComponent yang mengikuti siklus proses yang sama dengan ViewModel, dan dengan demikian, dapat bertahan saat terjadi perubahan konfigurasi. Untuk mencakup dependensi ke ViewModel, gunakan anotasi @ViewModelScoped.

Jenis @ViewModelScoped akan menjadikannya agar satu instance dari jenis cakupan diberikan di semua dependensi yang dimasukkan ke dalam ViewModel. Instance ViewModel lain yang meminta instance dengan cakupan akan menerima instance yang berbeda.

Jika satu instance perlu dibagikan ke berbagai ViewModel, instance harus dicakup menggunakan @ActivityRetainedScoped atau @Singleton.

Integrasi dengan library navigasi Jetpack

Tambahkan dependensi tambahan berikut ke file Gradle Anda:

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")
}

Jika ViewModel disertakan ke grafik navigasi, gunakan fungsi hiltNavGraphViewModels yang dapat digunakan dengan fragmen yang dianotasi dengan @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)

Integrasi dengan Jetpack Compose

Untuk melihat cara Hilt berintegrasi dengan Jetpack Compose, lihat bagian Hilt Compose dan library lainnya.

Menginjeksikan WorkManager dengan Hilt

Tambahkan dependensi tambahan berikut ke file Gradle Anda. Perhatikan bahwa selain library, Anda juga perlu menyertakan pemroses anotasi tambahan yang berfungsi mendukung pemroses anotasi 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")
}

Injeksikan Worker menggunakan anotasi @HiltWorker di class dan @AssistedInject di konstruktor objek Worker. Anda hanya dapat menggunakan @Singleton atau binding tidak tercakup dalam objek Worker. Anda juga harus menganotasi dependensi Context dan WorkerParameters dengan @Assisted:

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;
  }
  ...
}

Kemudian, minta class Application Anda mengimplementasikan antarmuka Configuration.Provider, memasukkan instance HiltWorkFactory, dan meneruskannya ke dalam konfigurasi WorkManager sebagai berikut:

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