Внедрение зависимостей (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 и как их использовать.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Manuel Vivo: Dependency Injection on Android with Hilt

Предыдущая статьяШкола ленивого разработчика: ускоренный курс по созданию фрагментов кода в VS Code
Следующая статья7 шагов до уровня Моцарта кода