Hilt zawiera rozszerzenia do udostępniania klas z innych bibliotek Jetpack. Hilt obsługuje obecnie te komponenty Jetpack:
ViewModel
- Nawigacja
- Compose
- Menedżer roboczy
Aby korzystać z tych integracji, musisz dodać zależności Hilt. Dla: więcej informacji o dodawaniu zależności znajdziesz w artykule Wstrzykiwanie zależności za pomocą Hilt.
Wstrzykiwanie obiektów ViewModel za pomocą Hilt
Podaj ViewModel
, dodając adnotacje
go w @HiltViewModel
i przy użyciu adnotacji @Inject
w ViewModel
za pomocą konstruktora obiektu.
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; } ... }
Następnie aktywność lub fragment z adnotacją @AndroidEntryPoint
może
pobierz instancję ViewModel
w zwykły sposób za pomocą interfejsu ViewModelProvider
lub
by viewModels()
Rozszerzenia 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
Wszystkie modele widoków Hilt są dostarczane przez ViewModelComponent
zgodny z
ten sam cykl życia co ViewModel
, dzięki czemu mogą przetrwać zmiany konfiguracji.
Aby ograniczyć zależność do ViewModel
, użyj adnotacji @ViewModelScoped
.
Typ @ViewModelScoped
sprawi, że pojedyncze wystąpienie zakresu
jest podany we wszystkich zależnościach wstrzykiwanych do typu ViewModel
.
Inne instancje ViewModel, które wysyłają żądania do instancji o zakresie w zakresie
do innej instancji.
Jeśli pojedyncza instancja musi być współdzielona przez różne modele widoku,
powinien być ograniczony za pomocą atrybutu @ActivityRetainedScoped
lub @Singleton
.
Integracja z biblioteką nawigacji Jetpack
Dodaj do pliku Gradle te dodatkowe zależności:
Odlotowe
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
Jeśli ViewModel
jest ograniczony do nawigacji
wykres,
użyj funkcji hiltNavGraphViewModels
, która działa z fragmentami, które są
dodano adnotację @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)
Integracja z Jetpack Compose
Aby dowiedzieć się, jak Hilt integruje się z Jetpack Compose, zapoznaj się z sekcją Hilt Utwórz i inne biblioteki.
Wstrzykiwanie narzędzia WorkManager za pomocą Hilt
Dodaj następujące dodatkowe zależności do pliku Gradle. Pamiętaj, że w polu musisz dodać do biblioteki dodatkowy procesor adnotacji, który działa na procesorach adnotacji Hilt:
Odlotowe
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") }
Wstrzyknij Worker
za pomocą
Adnotacja @HiltWorker
w zajęciach i @AssistedInject
w Worker
za pomocą konstruktora obiektu. W usłudze możesz używać tylko powiązań @Singleton
lub powiązań bez zakresu
Worker
obiektów. Musisz też dodać adnotacje do Context
i WorkerParameters
zależności z wartością @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; } ... }
Następnie weź udział w zajęciach na zajęciach Application
zaimplementuj interfejs Configuration.Provider
, wstaw instancję
HiltWorkFactory
i przekaż go do konfiguracji WorkManager
w następujący sposób:
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(); } }