Dagger 2 в многомодульном Android проекте

Sdílet
Vložit
  • čas přidán 28. 07. 2024
  • Демонстрация организации Dagger Component и связей между ними в многомодульном Android проекте
    💰 Поддержать проект на Boosty bit.ly/3sratqQ или Patreon / android_broadcast
    🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast
    🔗 Документация по Dagger dagger.dev/dev-guide/
    📺 Курс по Dagger 2 clck.ru/VtY7d
    🔗 Код из видео clck.ru/YRpyC
    Видео сделано при поддержке Лаборатории Касперского
    #AndroidBroadcast #DaggerКурс #Dagger2 #DI #DependncyInjection #Hilt #DaggerHilt #КириллРозов #РозовКирилл #mutibinding #component #subcomponent #модуляризация
    0:00 Вступление
    1:00 Что из Dagger будем использовать
    1:42 Правила модуляризация проекта
    3:08 Структура модулей в проекте
    5:26 Component в модулях
    7:41 Организация компонентов в модулях
    10:31 Хранение Component feature модуля
    13:09 Инициализация зависимостей feature component
    14:31 Inject в feature модуле
    15:03 Dagger + модуляризация != сложно
    15:45 Заключение

Komentáře • 62

  • @AndroidBroadcast
    @AndroidBroadcast  Před 2 lety +3

    🔗 Код из видео clck.ru/YRpyC
    💰 Поддержать проект на Boosty bit.ly/3sratqQ или Patreon patreon.com/android_broadcast
    🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast

  • @user-not_defined
    @user-not_defined Před 2 lety +13

    В целом довольно интересно, но что если в проекте Мокси + Dagger + Navigation Component + Многомодульность + Clean Arhitecture хотелось бы посмотреть как можно сделать красиво, + настроить модули внутри модулей транзитивно, чтобы постоянно implementation не писать от одних и тех же библиотек в разных фиче модулях к примеру

  • @alexkovalchuk3540
    @alexkovalchuk3540 Před 2 lety

    большое спасибо, очень доступно. Футболки - супер :)

  • @kafychannel
    @kafychannel Před 2 lety

    Спасибо,Кирилл,очень полезные видео !

  • @alekseyblekot119
    @alekseyblekot119 Před 2 lety +5

    Супер! Спасибо большое) действительно не сложно)
    Ещё классно, у вас в видео все время какие-то Котлин-плюшки вижу - типа by notNull() =)

  • @user-fd5tc4nx3d
    @user-fd5tc4nx3d Před 2 lety

    Ура-а-а! Спасибо большое!

  • @Ashimoro
    @Ashimoro Před 2 lety +4

    Спасибо!
    Интересно было бы послушать про клин архитектуру, и как она дружит с даггером

  • @user-ed6ps4ol9n
    @user-ed6ps4ol9n Před 2 lety +2

    Наконецто!!!

  • @user-xb3cj4th5e
    @user-xb3cj4th5e Před 2 lety

    спасибо

  • @deadchannal
    @deadchannal Před 2 lety

    Крутоь!

  • @user-eo5vg3ku4u
    @user-eo5vg3ku4u Před 2 lety

    супер

  • @quverr
    @quverr Před 2 lety +2

    Думаю многие уже заждались этого выпуска :)

  • @kulbabus
    @kulbabus Před rokem +2

    Для чего компонент фичи во вью модель класть, если его единственная зависимость в синглтоне хранится? Может есть решение как зависимость не в синглтоне хранить и ограничить жизненным циклом фичи?

  • @yuriyderkach9215
    @yuriyderkach9215 Před 2 lety

    Супер!!! Отдельное спасибо за ссылку на гитхаб) Огромная просьба не затягивайте с уроком про hilt, интересно послушать ваше мнение. На сколько я знаю hilt не саппортит динамик фичерс, было бы интересно послушать обо всем что он не умеет в отличии от даггера, чтоб не нарваться на неприятный нежданчик во время разработки)

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Он умеет все то же что и Dagger просто удобнее и больше генерирует кода, что упрощает интеграцию с Jetpack библиотеками

    • @user-vp8dn7ie9z
      @user-vp8dn7ie9z Před rokem

      ​@@AndroidBroadcastзначит лучше юзать Hilt?

  • @Mazaxict11
    @Mazaxict11 Před 2 lety +5

    Показалось маловато, прошёлся по верхам. Хотелось бы увидеть более глубокий разбор. Динамическое создание фичамодулей в реалтайме. Связи между двумя фичамодулями.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Я связь между фичамодулями не делаю, так как это усложняет архитектуру

  • @_Killana_
    @_Killana_ Před 2 lety

    Кирилл, привет. Скажи, пожалуйста, а как реализовать такое: Нужно получить @inject класса из модуля Б, в модуль А. Если модуль Б это сабкомпонент модуля А.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Доставить зависимость из сабкомпонент в комплект нельзя. Если сталкивается с тако задачей, то вы неправильно сделали архитектуру графа.
      Модули не могут доставлять зависимости, а уже тем более быть компонентами! Не путайте терминологию

  • @bolnoi8
    @bolnoi8 Před rokem

    Это что же, мы в фича модуле создаем синглтон хранилище, в которое Application пишет записывает свой компонент? Не считается ли это за утечку? Буквально не утечет конечно, компонент должен прожить столько же, сколько и процесс, но если пользователь на этот экран не собирается идти, то мы получаем ненужный указатель в памяти.

  • @user-zg3yu9xy6l
    @user-zg3yu9xy6l Před 2 lety +2

    Интересует, каким образом фича будет вызывать другую фичу, если фичемодули не должны знать друг о друге. Тот же NewsList должен открывать NewsDetails. В видео и в коде этот момент не описан

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Это не тема этого видео, но будет показано в отдельном

    • @AntonParonko
      @AntonParonko Před 2 lety +1

      Можешь сделать api модули для каждого фича модуля.
      Там будут реквесты и резалты для работы с конкретным модулем.

  • @nazirjonm6560
    @nazirjonm6560 Před 2 lety

    Спасибо большое, каким образом фича будет вызывать другую фичу, если я использую NewsDetails нескольким страницам.
    Для каждого viewmodel fragment/activity NewsDetails надо реализовать?
    Как будет этого правильно реализовать?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Я создаю в каждой фиче интерфейс с необходимым функционалом. Например, фича "news_list" будет иметь специальный интерфейс для навигации в детали, который должен будет предоставлен в зависимостях ArticlesComponent. app модуль знает все модули и сможет реализовать этот навигатор и перенаправлять в нужное русло
      При шаринге данных нужно все делать через слой данных

  • @qrampus9707
    @qrampus9707 Před 2 lety

    Спасибо за выпуск. Если у нас будет много фича-модулей и мы будем для каждого модуля предоставлять зависимости, имплементируя интерфейсы, не разрастётся ли наш основной компонент до огромных размеров?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Необязательно их должен основной компонент реализовывать. Это может кто угодно делать

  • @buddaset4226
    @buddaset4226 Před rokem

    13:05:
    упоминаются другие подходы реализации интерфейса Provider( отличные от синглтона) . А можно пример привести?

    • @AndroidBroadcast
      @AndroidBroadcast  Před rokem

      Нет, но это будет простой объект с каким-то временем существования и он должен заниматься в какой-то момент

  • @ivanchepelkin6347
    @ivanchepelkin6347 Před 2 lety

    Отличное решение хранить компоненты во вьюмодели!вопрос : как расшарить компоненты из вюмодели, чтоб можно было их видеть из любой точки приложения?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Можно сделать вот так gist.github.com/kirich1409/3fb3371703b8ed3b9d019f1b00625bca

  • @agp1444
    @agp1444 Před 2 lety

    ссылка на код из видео не открывается :-( пишет "Your connection is not private" и не пускает. это я что-то неправильно делаю?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety +1

      Наверное ссылка пытается в http открываться

  • @user-gc4wb2wb7c
    @user-gc4wb2wb7c Před 2 lety

    Возможно это глупый вопрос, но я не понял одного, почему при повороте экрана ArticlesFragment, стейт вьюмодельки не сохраняется и он опять билдит компонент

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      ViewModel (при правильном использовании) не будет пересоздаваться, поэтому там и хранится компонент. Возможно оговорка в ролике. Скиньте таймкод про какой момент говорите, пожалуйста

    • @user-gc4wb2wb7c
      @user-gc4wb2wb7c Před 2 lety

      ​@@AndroidBroadcast я скачал ваш код из репозитория, и поставил одну точку для дебага в ArticlesComponentViewModel (время на видео 12:02), а вторую в ArticlesFragment(время на видео 15:03)в методе onAttach на ViewModelProvider, и попробовал повернуть экран для изменения состояния, и при каждом повороте экрана я дебагом заходим в ArticlesComponentViewModel и в метод onAttach в ArticlesFragment, получается что компонент каждый раз пересоздавался в ArticlesComponentViewModel?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Нет, он получается. Там же нет вызова создания объекта. Обратите внимание на ссылку на ViewModel, что это один и тот объект в памяти

    • @user-gc4wb2wb7c
      @user-gc4wb2wb7c Před 2 lety

      @@AndroidBroadcast спасибо

  • @SmoukingMouse
    @SmoukingMouse Před 2 lety +4

    Google - сделал Dagger 2 и показал что в андроиде можно в нормальный и быстрый DI, выкатил к нему два разных "extension" что бы облегчить создание этого самого DI так что бы он оставался в рамках концепции DI.
    Андроид разработчики - продолжают использовать singleton.

  • @bro_chenzox
    @bro_chenzox Před rokem

    5:29 Интересная фраза🤔
    9:51 ArticlesDeps - это разве модуль?
    12:59 Непонятно - слышится как "ArticlesDeps у меня фактически ... [ это и есть ] ... Application Component, который ... [ так же ]... живет". Я правильно расслышал? Странно тогда. Ибо сначала(9:03) ArticlesDeps презентуется зрителям, как простой интерфейс, потом(9:51) как модуль, теперь уже это граф?
    Возникает вопрос, чтобы обойти такое непростое тройственное понятие, можно ли обойтись оригинальной "кодлабой" по Dagger в части к чему привязать жизненный цикл того, чего вы по вашему решили хранить во ViewModel? Я не пробовал сам пока, в процессе, хотелось бы узнать ваше мнение. А то у вас вышло не очень понятно, а разобраться хочется.
    13:10 При инициализации графа используется вызов .application(this) - это случаем не избыточно? Хотелось бы пример того, где вызов будет действительно полезен

    • @AndroidBroadcast
      @AndroidBroadcast  Před rokem

      Про модуль ArticleDeps - оговорка

    • @AndroidBroadcast
      @AndroidBroadcast  Před rokem

      Хранить компонент можно где вам угодно, ViewModel тоже подойдёт

    • @AndroidBroadcast
      @AndroidBroadcast  Před rokem

      application(this) передается в графе для того чтобы там был Context приложения, никакой избыточности

  • @Sk-gb2hx
    @Sk-gb2hx Před 2 lety

    +

  • @user-ed6ps4ol9n
    @user-ed6ps4ol9n Před 2 lety

    Есть очень хорошый цикл статей про многомодульность на хабре. От Лаборатории Касперского. Там тоже очень хорошие материалы. Но насколько я понимаю, концептуально вся "магия" для провайда зависиместей для фичи делается в основном руками.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Верно. Каждый выбирает свой подход и универсального решения нет

    • @user-ed6ps4ol9n
      @user-ed6ps4ol9n Před 2 lety

      Больше абстракций - больше свободы принятия решений)

    • @alekseyblekot119
      @alekseyblekot119 Před 2 lety

      Дайте ссылочку на хабр, плиз)

    • @user-ed6ps4ol9n
      @user-ed6ps4ol9n Před 2 lety

      @@alekseyblekot119 щас приеду в прекрасный пустой утренний офис и скину ссылочку)

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      А погуглить в хабе Лаборатории Касперского? Не ленитесь!

  • @sreda.jevgenij
    @sreda.jevgenij Před 11 měsíci

    Очень уж на профессиональном уровне, а можно простенко как-то. Ну например зделать приложения с двумя фрагментами или вьювсами и применить даггер, а то очень уж как-то не на земном языке. Хотя может это толька я тут такой :)
    Но все же спасибо!)

  • @evgeniierohin521
    @evgeniierohin521 Před 2 lety

    Так и не понимаю, зачем ты каждый раз пишешь Component.Builder - он же сам генерится.

    • @AndroidBroadcast
      @AndroidBroadcast  Před 2 lety

      Он у меня используется с кастомными параметрами

    • @evgeniierohin521
      @evgeniierohin521 Před 2 lety +4

      @@AndroidBroadcast Ну ты в примере указал ArticleDes как dependencies для ArticleComponent. Даггер автоматом сгенерирует метод в билдере для articleDeps . Других кастомных параметров я не вижу в конкретном примере.

  • @dmytromarchuk3023
    @dmytromarchuk3023 Před 2 lety

    dd

  • @ilyaguryanov9237
    @ilyaguryanov9237 Před 29 dny

    а в чем разница между:
    val newDetailsComponent = DaggerArticlesComponent.builder().deps(ArticlesDepsProvider.deps).build()
    и
    val newDetailsComponent = DaggerArticlesComponent.builder().deps(ArticlesDepsStore.deps).build() ?

    • @AndroidBroadcast
      @AndroidBroadcast  Před 28 dny

      Разница в том что разные классы предоставляют зависимость для построения Dagger компонента