Hilt enthält Erweiterungen, mit denen Klassen aus anderen Jetpack-Bibliotheken bereitgestellt werden können. Hilt unterstützt derzeit die folgenden Jetpack-Komponenten:
ViewModel
- Navigation
- Schreiben
- WorkManager
Sie müssen die Hilt-Abhängigkeiten hinzufügen, um diese Integrationen nutzen zu können. Für Weitere Informationen zum Hinzufügen von Abhängigkeiten finden Sie unter Abhängigkeitsinjektion mit Hilt.
ViewModel-Objekte mit Hilt einfügen
Geben Sie ein ViewModel
an, indem Sie
mit @HiltViewModel
und die Annotation @Inject
in der ViewModel
den Konstruktor des Objekts.
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; } ... }
Dann kann eine Aktivität oder ein mit @AndroidEntryPoint
annotiertes Fragment
Rufen Sie die ViewModel
-Instanz wie gewohnt mit ViewModelProvider
oder dem
by viewModels()
KTX-Erweiterungen:
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
Alle Hilt ViewModels werden von der ViewModelComponent
bereitgestellt, die den
denselben Lebenszyklus wie eine ViewModel
und können daher auch Konfigurationsänderungen überleben.
Um eine Abhängigkeit auf eine ViewModel
festzulegen, verwenden Sie die Annotation @ViewModelScoped
.
Der Typ @ViewModelScoped
sorgt dafür, dass eine einzelne Instanz des
wird für alle in ViewModel
eingefügten Abhängigkeiten bereitgestellt.
Andere Instanzen einer ViewModel, die die beschränkte Instanz anfordern, erhalten
in eine andere Instanz.
Wenn eine einzelne Instanz für verschiedene ViewModels freigegeben werden muss,
sollte entweder mit @ActivityRetainedScoped
oder @Singleton
festgelegt werden.
Integration in die Jetpack-Navigationsbibliothek
Fügen Sie Ihrer Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu:
Cool
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
Wenn Ihre ViewModel
auf die Navigation beschränkt ist
Grafik
hiltNavGraphViewModels
-Funktion verwenden, die mit Fragmenten funktioniert,
kommentiert mit @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)
Jetpack Compose einbinden
Informationen zur Integration von Hilt in Jetpack Compose finden Sie im Abschnitt "Hilt" des Composer und andere Bibliotheken:
WorkManager mit Hilt einfügen
Fügen Sie Ihrer Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu. Beachten Sie, dass in Neben der Bibliothek müssen Sie einen zusätzlichen Annotationsprozessor der auf dem Hilt-Annotationsprozessor basiert:
Cool
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") }
Injizieren Sie ein Worker
mithilfe der
@HiltWorker
-Annotation in der Klasse und @AssistedInject
in der Worker
den Konstruktor des Objekts. Sie können nur @Singleton
oder Bindungen ohne Geltungsbereich in
Worker
-Objekte. Sie müssen außerdem die Context
und WorkerParameters
annotieren.
Abhängigkeiten mit @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; } ... }
Geben Sie dann Ihren Application
-Kurs ein.
Configuration.Provider
-Schnittstelle implementieren, eine Instanz von
HiltWorkFactory
und übergeben Sie ihn wie folgt an die WorkManager
-Konfiguration:
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(); } }