Внедрение зависимостей (DI) — это метод, широко используемый в программировании и хорошо подходящий для Android-разработки. При нем зависимости предоставляются классу, а не создаются самостоятельно. Следуя принципам DI, вы закладываете основу для хорошей архитектуры приложения, лучшей повторяемости кода и простоты тестирования. Вы когда-нибудь пробовали внедрять подобное в приложение вручную? Даже при наличии многих существующих библиотек DI, сегодня требуется много шаблонного кода, поскольку проекты становятся больше и требуется строить каждый класс и его зависимости вручную, создавая контейнеры для повторного их использования и управления.
Следуя принципам DI, вы закладываете основу для хорошей архитектуры приложений, большей повторяемости кода и простоты тестирования.
Новая библиотека Hilt определяет стандартный способ выполнения DI в приложении, предоставляя контейнеры для каждого класса Android-проекта и автоматически управляя их жизненными циклами за вас.
Hilt построена поверх популярной библиотеки DI Dagger, поэтому ей свойственны те же характеристики, что и Dagger: время компиляции, производительность среды выполнения, масштабируемость и поддержка Android Studio. Благодаря этому Dagger получила большое распространение в 74% топ-10к приложений Google Play Store. Однако из-за генерации кода во время компиляции стоит ожидать увеличения времени сборки.
Поскольку многие классы фреймворка Android создаются самой ОС, при использовании Dagger в приложениях существует соответствующий шаблон. В отличие от Dagger, Hilt интегрирована с библиотеками Jetpack и классами фреймворка Android и удаляет большую часть шаблонной схемы, позволяя сосредоточиться только на важных частях определения и внедрения привязок, не беспокоясь об управлении всеми опциями и настройкой связей Dagger. Она автоматически генерирует и обеспечивает:
- Компоненты для интеграции классов фреймворка Android с Dagger, которые в противном случае пришлось бы создавать вручную.
- Аннотации области действия для компонентов.
- Предопределенные привязки и квалификаторы.
И самое лучшее — приложения можно переносить по мере необходимости, поскольку Dagger и Hilt могут сосуществовать вместе.
Hilt в действии
Просто чтобы показать, насколько проста в использовании Hilt, выполним несколько быстрых DI в типичном приложении для Android. Заставим Hilt ввести AnalyticsAdapter
в нашу MainActivity
.
Во-первых, включите Hilt в приложении через аннотацию класса с помощью приложения @HiltAndroidApp
, чтобы запустить генерацию кода Hilt:
@HiltAndroidApp
class MyApplication : Application() { ... }
Во-вторых, сообщите Hilt, как предоставить экземпляры AnalyticsAdapter
, аннотируя её конструктор с помощью @Inject
:
class AnalyticsAdapter @Inject constructor() { ... }
И в-третьих, чтобы ввести экземпляр AnalyticsAdapter
в MainActivity
, включите Hilt в activity с аннотацией @AndroidEntryPoint
и выполните инъекцию поля с помощью аннотации @Inject
:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// экземпляр аналитики был заполнен Hilt
// и готов к использованию
}
}
Для получения дополнительной информации можете легко проверить, что делают новые аннотации в разделе со шпаргалкой ниже.
Поставляется с поддержкой Jetpack!
Вы можете использовать свои любимые библиотеки Jetpack с Hilt из коробки. В релизе мы предоставляем поддержку прямого внедрения для ViewModel и WorkManager.
Например, чтобы внедрить компонент архитектуры ViewModel LoginViewModel
в LoginActivity
, аннотируйте LoginViewModel
с помощью @ViewModelInject
и используйте его в действии или фрагменте:
class LoginViewModel @ViewModelInject constructor(
private val analyticsAdapter: AnalyticsAdapter
): ViewModel { ... }
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
private val loginViewModel: LoginViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// loginViewModel готово к использованию
}
}
Подробнее о поддержке Jetpack читайте в документации.
Начните использовать Hilt
Если хотите узнать о Hilt больше, вот несколько ресурсов:
Начало работы с Hilt
Узнайте, как добавить Hilt в приложение для Android с помощью этого руководства.
Документация
Если вы новичок в DI или Dagger, ознакомьтесь с нашим руководством по добавлению Hilt в приложение для Android. Кроме того, если вы знаете Dagger, мы также предоставляем документацию по dagger.dev.
Если вам просто интересно узнать о новых аннотациях и о том, что можно сделать с Hilt, ознакомьтесь со шпаргалкой в разделе ниже.
Для пользователей Dagger
Если вы уже используете Dagger или dagger.android в приложении, ознакомьтесь с этим руководством по миграции или codelab, упомянутой ниже, для помощи в переключении на Hilt. Поскольку Dagger и Hilt могут сосуществовать вместе, вы можете переносить приложение постепенно.
Codelab
Чтобы изучить Hilt пошагово, мы выпустили две codelab:
Пример кода
Вы хотите увидеть, как Hilt используется в существующих приложениях? Проверьте это в приложении Google I/O 2020 и в ветви dev-hilt
репозитория c примерами архитектуры Android на Github.
Шпаргалка
Эта шпаргалка позволяет быстро увидеть, что делают различные аннотации Dagger и Hilt и как их использовать.
Читайте также:
- Корутины Kotlin: как работать асинхронно aв Android
- Новые инструменты Android 11 для обеспечения конфиденциальности и стабильности
- Как настроить базу данных с Firebase Firestore для Android
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Manuel Vivo: Dependency Injection on Android with Hilt