Menggunakan Hilt dengan library Jetpack lainnya

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

  • Tulis
  • ViewModel
  • Navigasi
  • WorkManager

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

Integrasi dengan Jetpack Compose

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

Menginjeksikan objek ViewModel dengan Hilt

Berikan ViewModel dengan menganotasinya menggunakan @HiltViewModel dan menggunakan anotasi @Inject dalam konstruktor objek ViewModel.

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

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

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

Menggunakan injeksi berbantuan dengan ViewModel

Hilt mendukung injeksi yang dibantu untuk ViewModel. Injeksi yang dibantu memungkinkan Anda menyuntikkan argumen runtime dinamis bersama dengan dependensi yang dikelola Hilt. Untuk menggunakan injeksi berbantuan, anotasi konstruktor ViewModel Anda dengan @AssistedInject, dan tandai parameter dinamis dengan @Assisted. Anda juga harus menentukan antarmuka @AssistedFactory, yang berfungsi sebagai jembatan bagi Hilt untuk otomatis membuat @ViewModelProvider.Factory yang diperlukan.

@HiltViewModel(assistedFactory = MyViewModel.Factory::class)
class MyViewModel @AssistedInject constructor(
    @Assisted val userId: String,
    private val repository: MyRepository
) : ViewModel() {
    @AssistedFactory interface Factory {
        fun create(userId: String): MyViewModel
    }
}

Di Compose, Anda dapat menggunakan factory yang dibantu dengan meneruskannya ke fungsi hiltViewModel selama navigasi atau inisialisasi layar. Pendekatan ini menghilangkan kebutuhan akan boilerplate pabrik manual sekaligus menjaga cakupan ViewModel Anda dengan benar ke tumpukan kembali navigasi. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Hilt tentang injeksi berbantuan.

@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

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0")
}

Groovy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0'
}

Di Jetpack Compose, library Navigation Compose dan Navigation 3 menggunakan fungsi hiltViewModel untuk otomatis mengambil ViewModel yang dicakupkan ke tujuan navigasi saat ini.

Di Navigation 3, tujuan navigasi direpresentasikan oleh NavEntry. Cakupan ViewModel ke NavEntry menggunakan rememberViewModelStoreNavEntryDecorator. Gunakan hiltViewModel di dalam penyedia untuk NavEntry tersebut guna mengambil ViewModel terkait.

NavDisplay(...,
  entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()),
  entryProvider = entryProvider {
    entry { key ->
      val viewModel = hiltViewModel()
      MyScreen(viewModel = viewModel)
    }
  }
)

Di Navigation Compose, ViewModel otomatis dicakup ke tujuan navigasi. Untuk mengetahui informasi selengkapnya, lihat Hilt dan Navigation.

val viewModel = hiltViewModel()

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

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    ksp("androidx.hilt:hilt-compiler:1.3.0")
}

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  ksp 'androidx.hilt:hilt-compiler:1.3.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:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

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

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}