Utilizzare Hilt con altre librerie Jetpack

Hilt include estensioni per fornire classi da altre librerie Jetpack. Hilt attualmente supporta i seguenti componenti Jetpack:

  • Scrivi
  • ViewModel
  • Navigazione
  • WorkManager

Per usufruire di queste integrazioni, devi aggiungere le dipendenze Hilt. Per maggiori informazioni sull'aggiunta di dipendenze, consulta Inserimento delle dipendenze con Hilt.

Integrazione con Jetpack Compose

Per scoprire come Hilt si integra con Jetpack Compose, consulta la sezione Hilt di Compose e altre librerie.

Inserire oggetti ViewModel con Hilt

Fornisci un ViewModel annotandolo con @HiltViewModel e utilizzando l'annotazione @Inject nel costruttore dell'oggetto ViewModel.

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

Quindi, un'attività annotata con @AndroidEntryPoint può ottenere l'istanza ViewModel normalmente utilizzando ViewModelProvider o le by viewModels() estensioni KTX:

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

Utilizzare l'inserimento assistito con ViewModels

Hilt supporta l'inserimento assistito per i ViewModels. L'inserimento assistito ti consente di inserire argomenti di runtime dinamici insieme alle dipendenze gestite da Hilt. Per utilizzare l'inserimento assistito, annota il costruttore ViewModel con @AssistedInject e contrassegna i parametri dinamici con @Assisted. Devi anche definire un'interfaccia @AssistedFactory, che funge da ponte per Hilt per generare automaticamente il @ViewModelProvider.Factory necessario.

@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
    }
}

In Compose, puoi utilizzare la factory assistita passandola alla funzione hiltViewModel durante la navigazione o l'inizializzazione dello schermo. Questo approccio elimina la necessità di boilerplate di fabbrica manuali mantenendo il ViewModel correttamente limitato allo stack di navigazione. Per saperne di più, consulta la documentazione di Hilt sull'iniezione assistita.

@ViewModelScoped

Tutti gli Hilt ViewModel sono forniti da ViewModelComponent, che segue lo stesso ciclo di vita di un ViewModel e, pertanto, può sopravvivere alle modifiche alla configurazione. Per limitare l'ambito di una dipendenza a un ViewModel, utilizza l'annotazione @ViewModelScoped.

Un tipo @ViewModelScoped fa in modo che venga fornita una singola istanza del tipo con ambito in tutte le dipendenze inserite in ViewModel. Altre istanze di un ViewModel che richiedono l'istanza con ambito riceveranno un'istanza diversa.

Se una singola istanza deve essere condivisa tra varie ViewModel, deve essere definita l'ambito utilizzando @ActivityRetainedScoped o @Singleton.

Integrazione con le librerie di navigazione Jetpack

Aggiungi le seguenti dipendenze aggiuntive al file Gradle:

app/build.gradle

Kotlin

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

Alla moda

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

In Jetpack Compose, le librerie Navigation Compose e Navigation 3 utilizzano entrambe la funzione hiltViewModel per recuperare automaticamente un ViewModel con ambito nella destinazione di navigazione corrente.

In Navigazione 3, le destinazioni di navigazione sono rappresentate da NavEntry. Definisci l'ambito dei ViewModel per NavEntrys utilizzando rememberViewModelStoreNavEntryDecorator. Utilizza hiltViewModel all'interno del provider per recuperare la ViewModel associata per NavEntry.

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

In Navigation Compose, i ViewModel vengono automaticamente limitati alle destinazioni di navigazione. Per ulteriori informazioni, vedi Hilt e navigazione.

val viewModel = hiltViewModel()

Inserire WorkManager con Hilt

Aggiungi le seguenti dipendenze aggiuntive al file Gradle. Tieni presente che, oltre alla libreria, devi includere un processore di annotazioni aggiuntivo che funzioni in aggiunta al processore di annotazioni 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")
}

Alla moda

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

Inserisci un Worker utilizzando l'annotazione @HiltWorker nella classe e @AssistedInject nel costruttore dell'oggetto Worker. Puoi utilizzare solo @Singleton o associazioni senza ambito negli oggetti Worker. Devi anche annotare le dipendenze Context e WorkerParameters con @Assisted:

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

Quindi, fai in modo che la classe Application implementi l'interfaccia Configuration.Provider, inserisci un'istanza di HiltWorkFactory e passala alla configurazione WorkManager come segue:

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

  @Inject lateinit var workerFactory: HiltWorkerFactory

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