Hilt включает расширения для предоставления классов из других библиотек Jetpack. В настоящее время Hilt поддерживает следующие компоненты Jetpack:
-
ViewModel
- Навигация
- Сочинить
- Менеджер работ
Вы должны добавить зависимости Hilt, чтобы воспользоваться преимуществами этой интеграции. Дополнительные сведения о добавлении зависимостей см. в разделе Внедрение зависимостей с помощью Hilt .
Внедрение объектов ViewModel с помощью Hilt
Предоставьте ViewModel
, добавив к нему аннотацию @HiltViewModel
и используя аннотацию @Inject
в конструкторе объекта ViewModel
.
Котлин
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Ява
@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; } ... }
Затем действие или фрагмент, помеченный @AndroidEntryPoint
может получить экземпляр ViewModel
как обычно, используя ViewModelProvider
или расширения KTX by viewModels()
:
Котлин
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Ява
@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
Все модели Hilt ViewModel предоставляются ViewModelComponent
, который имеет тот же жизненный цикл, что и ViewModel
, и поэтому может пережить изменения конфигурации. Чтобы определить зависимость от ViewModel
используйте аннотацию @ViewModelScoped
.
Тип @ViewModelScoped
сделает так, что один экземпляр типа с ограниченной областью будет предоставлен для всех зависимостей, внедренных в ViewModel
. Другие экземпляры ViewModel, запрашивающие экземпляр с заданной областью, получат другой экземпляр.
Если один экземпляр необходимо использовать в различных ViewModel, его область следует определить с помощью @ActivityRetainedScoped
или @Singleton
.
Интеграция с навигационной библиотекой Jetpack.
Добавьте следующие дополнительные зависимости в ваш файл Gradle:
классный
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Котлин
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
Если ваша ViewModel
ограничена графом навигации , используйте функцию hiltNavGraphViewModels
, которая работает с фрагментами, помеченными с помощью @AndroidEntryPoint
.
Котлин
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
Ява
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph); ExampleViewModel exampleViewModel = new ViewModelProvider( backStackEntry, HiltViewModelFactory.create(context, backStackEntry) ).get(ExampleViewModel.class)
Интеграция с Jetpack Compose
Чтобы узнать, как Hilt интегрируется с Jetpack Compose, см. раздел Hilt Compose и других библиотек .
Внедрение WorkManager с помощью Hilt
Добавьте следующие дополнительные зависимости в ваш файл Gradle. Обратите внимание, что помимо библиотеки вам необходимо включить дополнительный обработчик аннотаций, который работает поверх обработчика аннотаций Hilt:
классный
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' }
Котлин
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") }
Внедрите Worker
, используя аннотацию @HiltWorker
в классе и @AssistedInject
в конструкторе объекта Worker
. В объектах Worker
можно использовать только привязки @Singleton
или незаданные области видимости. Вы также должны аннотировать зависимости Context
и WorkerParameters
с помощью @Assisted
:
Котлин
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Ява
@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; } ... }
Затем пусть ваш класс Application
реализует интерфейс Configuration.Provider
, внедрит экземпляр HiltWorkFactory
и передаст его в конфигурацию WorkManager
следующим образом:
Котлин
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }
Ява
@HiltAndroidApp public class ExampleApplication extends Application implements Configuration.Provider { @Inject HiltWorkerFactory workerFactory; @Override public Configuration getWorkManagerConfiguration() { return new Configuration.Builder() .setWorkerFactory(workerFactory) .build(); } }