Hilt include estensioni per fornire classi di altre librerie Jetpack. Al momento Hilt supporta i seguenti componenti Jetpack:
ViewModel
- Navigazione
- Scrivi
- Responsabile lavoro
Devi aggiungere le dipendenze di Hilt per utilizzare queste integrazioni. Per saperne di più sull'aggiunta di dipendenze, consulta Inserimento delle dipendenze con Hilt.
Inserisci oggetti ViewModel con Hilt
Fornisci un elemento ViewModel
annotandolo con @HiltViewModel
e utilizzando l'annotazione @Inject
nel costruttore dell'oggetto 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; } ... }
Quindi, un'attività o un frammento annotato con @AndroidEntryPoint
può recuperare l'istanza ViewModel
normalmente utilizzando ViewModelProvider
o le estensioni KTX 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
Tutti i modelli Hilt ViewModel sono forniti da ViewModelComponent
, che segue lo stesso ciclo di vita di un ViewModel
e, come tali, possono sopravvivere alle modifiche alla configurazione.
Per definire l'ambito di una dipendenza in un ViewModel
, utilizza l'annotazione @ViewModelScoped
.
Un tipo @ViewModelScoped
farà in modo che venga fornita una singola istanza del tipo con ambito in tutte le dipendenze inserite in ViewModel
.
Le altre istanze di un ViewModel che richiedono l'istanza con ambito riceveranno un'istanza diversa.
Se una singola istanza deve essere condivisa tra vari ViewModel, l'ambito deve essere limitato utilizzando @ActivityRetainedScoped
o @Singleton
.
Integrazione con la libreria di navigazione Jetpack
Aggiungi le seguenti dipendenze aggiuntive al file Gradle:
Trendy
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
Se ViewModel
ha come ambito il grafico di navigazione,
utilizza la funzione hiltNavGraphViewModels
che lavora con i frammenti
annotati con @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)
Integrazione con Jetpack Compose
Per scoprire come Hilt si integra con Jetpack Compose, consulta la sezione Hilt di Compose e altre librerie.
Inserisci 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 funziona sopra il processore di annotazioni Hilt:
Trendy
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") }
Inserisci Worker
utilizzando l'annotazione
@HiltWorker
nella classe e @AssistedInject
nel costruttore dell'oggetto Worker
. Puoi utilizzare solo @Singleton
o associazioni senza ambito in Worker
oggetti. Devi anche annotare le dipendenze Context
e WorkerParameters
con @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; } ... }
Quindi, chiedi alla classe Application
di implementare l'interfaccia Configuration.Provider
, inserire un'istanza di HiltWorkFactory
e trasmetterla alla configurazione WorkManager
come segue:
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(); } }