Hilt include estensioni per fornire corsi di altre librerie Jetpack. Attualmente Hilt supporta i seguenti componenti Jetpack:
ViewModel
- Navigazione
- Compose
- Responsabile del lavoro
Per sfruttare queste integrazioni, devi aggiungere le dipendenze Hilt. Per Per saperne di più sull'aggiunta di dipendenze, consulta Inserimento delle dipendenze con Elsa.
Inserisci oggetti ViewModel con Hilt
Fornisci una ViewModel
aggiungendo annotazioni
con @HiltViewModel
e utilizzando l'annotazione @Inject
in ViewModel
costruttore dell'oggetto.
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ò
ottieni l'istanza ViewModel
normalmente utilizzando ViewModelProvider
o
by viewModels()
Estensioni KTX:
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 ViewModel Hilt sono forniti dall'ViewModelComponent
, che segue le
lo stesso ciclo di vita di un ViewModel
e, come tale, può sopravvivere alle modifiche alla configurazione.
Per limitare l'ambito di una dipendenza a un ViewModel
, utilizza l'annotazione @ViewModelScoped
.
Un tipo @ViewModelScoped
renderà in modo che una singola istanza dell'ambito
viene fornito in tutte le dipendenze inserite in ViewModel
.
Le altre istanze di un ViewModel che richiedono l'istanza con ambito riceveranno
per un'altra istanza.
Se una singola istanza deve essere condivisa tra più ViewModel,
deve essere limitato utilizzando @ActivityRetainedScoped
o @Singleton
.
Integrazione con la libreria di navigazione Jetpack
Aggiungi le seguenti dipendenze aggiuntive al file Gradle:
Alla moda
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
Se ViewModel
è limitato alla navigazione
grafico,
la funzione hiltNavGraphViewModels
che funziona con i frammenti
annotato 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 altro processore di annotazione che si basa sul processore di annotazione Hilt:
Alla moda
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 un elemento Worker
utilizzando
@HiltWorker
annotazione nel corso e @AssistedInject
in Worker
costruttore dell'oggetto. Puoi utilizzare solo @Singleton
o associazioni senza ambito in
Worker
oggetti. Devi anche annotare 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 al tuo corso Application
.
implementare l'interfaccia Configuration.Provider
, inserire un'istanza
HiltWorkFactory
e passalo 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(); } }