Русский
Русский
English
Статистика
Реклама

Из песочницы Hilt еще один DI?

Встречайте Hilt Dependency Injection (DI) в JetPack, но это не правда, так как Hilt это просто обертка для Dagger2. Для небольших проектов сможет встать более удобным инструментом и хорошо интегрируется с остальными продуктами в JetPack.


Не буду описывать как добавить в проект, все хорошо описано в статье


Зачем?


Dagger2 довольно сложный DI, можно легко запутаться, что и куда поместил. Придумывать бесконечное количество компонентов и увеличивается количество абстракций. И чем больше проект, тем больше увеличивается путаница.


И если хочется использовать Dagger2, но с минимальными усилиями, то для этого как раз и был придуман Hilt.


Что упростили для нас:


  • Готовые компоненты (из названий понятно к чему относятся)
    • ApplicationComponent
    • ActivityRetainedComponent
    • ActivityComponent
    • FragmentComponent
    • ViewComponent
    • ViewWithFragmentComponent
    • ServiceComponent
  • В модуле указываешь в какой компонент добавить
  • Через @AndroidEntryPoint Hilt компилятор генерирует весь bolierplate для создания компонента и хранения (например, ActivityRetainedComponent сохранит сущность после поворота экрана, ActivityComponent пересоздаст заново).

Такой код выглядит довольно элегантно (весь boilerplate за нас сгенерируется)


@AndroidEntryPointclass ExampleActivity : AppCompatActivity() {     @Inject lateinit var testService: TestService}

Особенности


Application обязателен


Необходимо объявить Application и пометить @HiltAndroidApp, без него Hilt не заработает.


@HiltAndroidAppclass App : Application() { }

Иерархическая зависимость


Если хотите использовать Hilt в фрагментах, то Activity которая содержит эти фрагменты обязательно помечать аннотацией @AndroidEntryPoint


Если View пометить @WithFragmentBindings то Fragment должен быть с аннотацией @AndroidEntryPoint, а без этой аннотации зависит от того куда инжектимся Activity или Fragment


Объявление модулей


Все как в Dagger2, но нет необходимости добавлять модуль в компонент, а достаточно использовать аннотацию @InstallIn. Это и понятно, так как компоненты не доступны для редактирования.


@InstallIn(ApplicationComponent::class)@Moduleclass NetworkModule {    @Singleton    @Provides    fun provideHttpService(): HttpService {        return object : HttpService {            init {                Log.e("Tester", "HttpService initialized")            }            override fun request() {                Log.e("Tester", "HttpService::request")            }        }    }}

При добавления Hilt, все модули должны быть с @InstallIn, либо компилятор ругнется, что аннотация отсутствует.


Кастомные Component и Subcomponent


Создать их конечно можно, так как там Dagger2, но теряется тогда весь смысл Hilt и все придется писать вручную. Вот что предлагается в документации:


DaggerLoginComponent.builder()        .context(this)        .appDependencies(          EntryPointsAccessors.fromApplication(            applicationContext,            LoginModuleDependencies::class.java          )        )        .build()        .inject(this)

Поддержка многомодульности


Все это есть, но только когда используем только готовые компоненты. Но если добавить для каждого модуля свои компоненты (как советуют тут), то лучше использовать Dagger2.


Ограничения для @AndroidEntryPoint


  • Поддерживаются Activity наследуемые от ComponentActivity и AppCompatActivity
  • Поддерживаются Fragment наследуемые от androidx.Fragment
  • Не поддерживаются Retain фрагменты

Что внутри


Hilt работает следующим образом:


  • Генерируются Dagger Component-ы
  • Генерируются базовые классы для Application, Activity, Fragment, View и т.д, которые помечены аннотацией @AndroidEntryPoint
  • Dagger компилятор генерирует статический коды

Как устроено хранение ActivityRetainedComponent


Не стали усложнять и просто поместили компонент в ViewModel из arch библиотеки:


this.viewModelProvider =        new ViewModelProvider(            activity,            new ViewModelProvider.Factory() {              @NonNull              @Override              @SuppressWarnings("unchecked")              public <T extends ViewModel> T create(@NonNull Class<T> aClass) {                ActivityRetainedComponent component =                    ((GeneratedComponentManager<LifecycleComponentBuilderEntryPoint>)                            activity.getApplication())                        .generatedComponent()                        .retainedComponentBuilder()                        .build();                return (T) new ActivityRetainedComponentViewModel(component);              }            });

Итог


Плюсы:


  • Более простое использование чем Dagger2
  • Добавление модулей через аннотацию выглядит довольно удобно (в несколько уже не поместишь)
  • Код чище и много boilerpate спрятано.
  • Все плюсы от Dagger2 (генерация статического кода, валидация зависимостей и т.д.)
  • Удобен для небольших проектов

Минусы:


  • Тяжело избавится, не только захочется убрать или заменить, но и просто перейти на Dagger2
  • Тяжело добавить кастомные компоненты, что ограничивает использование с крупных проектах
  • Наследует минусы Dagger2 и еще больше увеличивает время сборки
  • Иерархическая зависимость, например, нельзя использовать в Fragment без Activity c @AndroidEntryPoint

Полезные ссылки:


Источник: habr.com
К списку статей
Опубликовано: 11.08.2020 20:13:10
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Разработка под android

Jetpack

Androidx

Hilt

Dependency injection

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru