Организация модулей. Типы Inject. Способы доставки зависимостей

Поділитися
Вставка
  • Опубліковано 9 жов 2024

КОМЕНТАРІ • 191

  • @AndroidBroadcast
    @AndroidBroadcast  3 роки тому +7

    💰 Поддержать проект на Boosty bit.ly/3sratqQ или Patreon patreon.com/android_broadcast
    🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast
    Видео сделано при поддержке Лаборатории Касперского

  • @qIKraytonIp
    @qIKraytonIp 3 роки тому +28

    Пожалуй одна из самых ценных серий видео-уроков, что я видел, жду 3ю часть

  • @yakiv1488
    @yakiv1488 3 роки тому +24

    Курс бомбический! Это лучшее объяснение Dagger из всего что я видел!

  • @divanlobkowski3473
    @divanlobkowski3473 3 роки тому +53

    Самое быстрое объяснение dagger на диком западе.

  • @vladimirdaryin9351
    @vladimirdaryin9351 3 роки тому +2

    Благодарю, уже сколько лет работа с Dagger оставляет ощущение, что что-то не до конца понимаешь, эти уроки помогли прояснить общую картину + пару новых удобных моментов себе в проекты утяну, спасибо! 🙏🏻

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +1

      Супер! Значит у курса получается делать что нужно

  • @uservhhrXdgko1234
    @uservhhrXdgko1234 3 роки тому +4

    Боже какой же топовый расклад. Это просто божественно, дай бог тебе здоровья)

  • @sonar_devices
    @sonar_devices 3 роки тому +7

    Большое спасибо. Очень интересно.

  • @grigoriy3615
    @grigoriy3615 3 роки тому +4

    Спасибо за видео. Такие видео очень нужны!!!

  • @immortal_lnight
    @immortal_lnight 2 роки тому +1

    Хоть временами и сложно понять что-то, но спасибо за проделанную работу, Кирилл!

  • @МобильныйРазработчик-ъ3с

    Было очень интересно,большое спасибо!

  • @UCfpBnsCG17QVj5bLvbBjBrQ
    @UCfpBnsCG17QVj5bLvbBjBrQ 2 роки тому

    Очень классный курс, важно не только посмотреть но и попробовать все что в нем рассказывается. Больше спасибо за труд 🙏

  • @ЕгорПоляков-т5ъ
    @ЕгорПоляков-т5ъ 3 роки тому +1

    Спасибо большое за курсы, очень приятно слушать профессионала своего дела)

  • @codemachine19
    @codemachine19 Рік тому

    Непросто урок, но подача очень интересная. Спасибо за материал!

  • @Mozartnab
    @Mozartnab 2 роки тому +1

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

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Задавай вопросы, я буду отвечать в комментария

    • @Mozartnab
      @Mozartnab 2 роки тому +1

      @@AndroidBroadcast Решил для себя, что нужно сначала разобраться с нативным дагером. А потом уже смотреть в сторону хилта и т.д. Так как я еще совсем джун, и мне нужно знать как это все работает. Сейчас думаю над архитектурой. Я правильно понимаю, что для большинства прложений схема такая. 1 главный апп компонент, который подтягивает все зависимости ему необходимые, и по компоненту на каждую фичу, которые в свою очередь подтягивают все зависимости, которые нужны в этой фиче?

    • @Mozartnab
      @Mozartnab 2 роки тому

      и как это должно по хорошему в проекте выглядеть? типо условно папка Даггер, там хранятся компоненты, а внутри компонентов уже модули интерфейсы инджект, скоупы и т.д. Или папка дагер и там 3 папки компоненты, модули, скоупы.

    • @Mozartnab
      @Mozartnab 2 роки тому

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

    • @Mozartnab
      @Mozartnab 2 роки тому

      @@AndroidBroadcast Извиняюсь за нубские вопросы, заранее спасибо.

  • @ИванИванов-в4н9п
    @ИванИванов-в4н9п 2 роки тому +2

    Фабрика для фабрики, квалификатор с названием "квалификатор". Ошибка BNR (Brain Not Responding) =)
    Если серьезно, то согласен с другими зрителями, что видосы у Кирилла топ! Давно смотрю.

  • @sergeyjoke
    @sergeyjoke Рік тому

    Спасибо. Очень хороший курс. Очень!

  • @mukhtarbimurat5106
    @mukhtarbimurat5106 3 роки тому +5

    Спасибо, очень полезно, еще хотелось узнать как правильно заменить prod на stage ретрофит в зависимости от какого то конфига (допустим BuildConfig.DEBUG) не меняя остальные деклараций(такие как репозиторий, use case и т.д)

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +5

      Я предпочитаю это делать через прокидывание параметра при создании Component. Будет показано в следующем уроке

    • @mitiaygorodov4939
      @mitiaygorodov4939 3 роки тому

      @@AndroidBroadcast А если эту переменную прописать в градле, и при переключении типа сборки оно автоматически меняло значение на нужное? Этот подход имеет место быть?

  • @KudashovDev
    @KudashovDev 3 роки тому +1

    Круто! Самое доступное и понятное объяснение дагера)

  • @alexiachimov9817
    @alexiachimov9817 3 роки тому

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

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +1

      Спасибо! Очень приятно читать такие комменты

  • @MikhailGureev
    @MikhailGureev 3 роки тому

    Большое спасибо, Кирилл.

  • @lemarkmain1713
    @lemarkmain1713 2 роки тому

    Спасибо, как раз то что нужно!

  • @beginnercoding1089
    @beginnercoding1089 3 роки тому

    Спасибо большое за урок!

  • @denislopatkin6996
    @denislopatkin6996 5 місяців тому

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

  • @Александр-м7о7т
    @Александр-м7о7т 2 роки тому

    Очень крутой курс
    Спасибо

  • @azatnabiullin2263
    @azatnabiullin2263 2 роки тому +1

    На мой взгляд, плейлист про Dagger у Coding in Flow намного более последовательный и понятный. Хотя, возможно, курс Кирилла предназначен для более продвинутой аудитории. Многие вещи не объясняются, словно их понимание само самой разумеется, поэтому после этого курса есть риск использования их вслепую, потому что Кирилл так написал)

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      У меня весь канал не про новичков, а разработчиков с уже каким-то пониманием технологий. Любой курс имеет свою специфику, подачу, трансляцию опыта и авторский взгляд

  • @antony5092
    @antony5092 2 роки тому

    Все круто, но не совсем понимаю для чего на 4 минуте добавлять 2 provides для newsRepository. Dagger позволяет же указывать возвращаемый абстрактный тип, но на самом деле возвращаеть его реализацию.

  • @MrPwnzrus
    @MrPwnzrus 3 роки тому

    Спасибо , очень познавательно!!!

  • @kirill6020
    @kirill6020 3 роки тому

    Спасибо за видео!

  • @Mozartnab
    @Mozartnab 2 роки тому +1

    А еще вопрос, я тут делаю универсальный метод по созданию компонента через рефлексию, и хочу составить стрингу из Dagger + название компонента. Но тут возникает проблема, дагер иногда генерирует свой класс, как в названии компонента, а иногда использует нижнее подчеркивание. Вот пример - DaggerProductPresenter_Component и DaggerDataManagerComponent почему в одном так в другом так, от чего это зависит и есть ли еще вариации таких классов?

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Это внутренние классы, нет никаких гарантий их названий и они могут меняться от версии к версии, как и вовсе исчезнуть

    • @Mozartnab
      @Mozartnab 2 роки тому

      @@AndroidBroadcast понятно, спасибо, а как тогда лучше сделать универсальный метод createComponent?

    • @Mozartnab
      @Mozartnab 2 роки тому

      типо метод, который принимает в себя класс, который нужно создать, список модулей и список зависимостей

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Это слишком общая задача в которой нет ограничений на выходные параметры. Лучше создавать их без рефлексии обычным способом. Это будет надёжнее и безопаснее при изменении API

  • @axrorxojayodgorov3416
    @axrorxojayodgorov3416 3 роки тому

    Thank you, really helpful tutorial

  • @handleftman
    @handleftman 3 роки тому

    Спасибо за урок! а код viewModel не слишком ли запутанный? где-то видел и даже использовал реализацию фабрики как синглтон в даггере. Надеюсь это будет в следующих частях видео :)

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

      Да, пример не лучший, но жизненный. Такую сложность оптимизировали в Hilt и вот там уже проще

  • @d.mertsalov
    @d.mertsalov 3 роки тому

    Спасибо!

  • @aliaksandr_chaulytka
    @aliaksandr_chaulytka 3 роки тому +1

    🔝🔝🔝
    При Lazy инстанс кэшируется только для конкретного места (активити/фрагмента) или как ?
    Как вообще инстансы создаются в даггере? По умолчанию все синглтоны или фабрики?
    (В коине это сразу в DSL указывается, вот у меня и возник такой вопрос)

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +3

      Да, в графе кэширование настраивается через Scope (будет в уроке 3). Lazy получает зависимость из графа и кеширует ее внутри себя, чтобы при следующем запросе не ходить за ней снова.

  • @deadchannal
    @deadchannal 3 роки тому +1

    А какие плагины для Android Studio вы используете?

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +4

      Надо снять видео отдельное на эту тему

  • @essohaitch8147
    @essohaitch8147 3 роки тому

    Отличный ролик

  • @epicarchitect
    @epicarchitect 2 роки тому

    Спасибо за урок но у меня возник вопрос тут 7:07. Почему писать анотацию инжект лучше в конструктор а не в модуле делать функцию с провайд анотацией? Тогда ведь весь диай будет размазан по приложению.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Тогда зависимости не будут зависеть от графа и легче переносить код по модулям

  • @staschernov928
    @staschernov928 Рік тому

    А можно, пожалуйста, выкладывать и сами проекты? А то по краткому обзору вначале невозможно все запомнить, и чтобы понять, о чем идет речь, приходится дублировать вкладку и смотреть 2 разных таймкода.

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому

      Ссылки в описании к видео разве нет?

    • @staschernov928
      @staschernov928 Рік тому

      @@AndroidBroadcast ага, нашел, спасибо. В первый раз, видимо, проглядел.

  • @deo5686
    @deo5686 2 роки тому

    Приветствую, спасибо за такой хороший курс. У меня есть вопрос, - @Inject constructor в domain, насколько это удобно, а если мы разрабатываем не только для андроида, не будут ли с этим проблемы? Я может многого не знаю, но мне кажется, если бы мы объявили явно все provides, - это было бы более лаконично, так как мы оставим зависимости все что связанно с di только в app модуле. Спасибо.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Аннотация Inject не является части Dagger, а она часть JSR 330. Это переносится в рамках любого решения на Java

  • @GriNAME
    @GriNAME Рік тому

    Эх, хороший курс)

  • @FoRGeish
    @FoRGeish 3 роки тому

    Не очень понял, почему в качестве основного способа показан избыточный с добавлением метода provide*_to_*, а нормальный рабочий вариант в виде небольшой сноски?

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

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

  • @ljlj
    @ljlj Рік тому

    Как использовать assisted inject, чтобы получить репозиторий в usecase, когда он находится в модуле, в котором нет даггера, до этого момента он там не нужен был вообще, так как usecase резолвились в модуле, который app

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому

      Вы должны добавить репозиторий в граф: либо модуль и Provide, либо Bind при создании компонента или другие способы

  • @ildar2244
    @ildar2244 3 роки тому

    Спасибо за труд - очень полезно. В описании к видео ссылка на "Курс по Dagger 2" выдаёт результат что плейлист не существует.

  • @andreikravchenko5612
    @andreikravchenko5612 6 місяців тому

    На видео ошибка. Lazy не работает для типов, которые отмечены @AssistedFactory, соответственно сделать фабрику фабрики вьюмодели как на видео нельзя, после запуска будет ошибка:
    Dagger does not support injecting Lazy, Producer, or Produced when T is an @AssistedFactory-annotated type

  • @Capitistrum
    @Capitistrum Рік тому

    Спасибо за курс! После просмотра начало понимание приходить как устроен Dagger и DI в принципе
    Вопрос по Inject в метод. Как понял из видео, при аннотации @Inject метод будет выполнен автоматически один раз. А если мне не нужно его выполнение? Например, он должен выполниться при определенных условиях, иначе нет. И есть зависимость которая необходима только ему в классе. Так как метод может и не выполнится, кажется логичным не держать в поле ссылку на необходимую зависимость. Или получается все же в поле хранить?🤔

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому +1

      Можно делать Inject в методе или в конструктор

    • @Capitistrum
      @Capitistrum Рік тому

      @@AndroidBroadcast да, это я понял. Если делать Inject в метод - то этот метод будет 100% выполнен при инициализации класса? Нет варианта чтобы он не выполнялся автоматически, а по необходимости?

  • @legioncommander7261
    @legioncommander7261 2 роки тому

    А как так работает AssistedFactory? Это же интерфейс, где прописывается реализация?

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Реализация генерится, как и реализация Component в Dagger

  • @inex550
    @inex550 2 роки тому

    Топ. Просто топ.

  • @GarcianSmt
    @GarcianSmt 3 роки тому

    Я правильно понимаю, что при желании можно использовать только provides вместо binds, и это лишь дело вкуса?

  • @deadchannal
    @deadchannal 3 роки тому

    Ккк, прикольно!

  • @dmtrlbdv
    @dmtrlbdv 3 роки тому

    хорошо бы ссылки на предыдущие и следующие уроки

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +2

      В описании плейлист со всеми видео

  • @andrew3937
    @andrew3937 2 роки тому

    А как на 23:13 создается viewModel, если на тот момент factory еще не заинжекчена. Одно происходит в момент создания класса, второе только в onAttach(). Я не оч понимаю, подскажите, пожалста.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому +1

      Она создаётся только при первом обращении к ней, а дальше сохраняется. Если вы до inject не обратитесь к ViewModel, то все будет хорошо

  • @kirillvolkov8556
    @kirillvolkov8556 3 роки тому +1

    в новых версиях работа с AssistedFactory невозможна с делегатами

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

      Можно больше информации. Что именно невозможно иэ кода сделать?

  • @olegleonov1310
    @olegleonov1310 3 роки тому

    Так, а почему бы вместо фабрики фабрик не сделать setNewsId для viewModel? И не делать newsId в конструкторе. А то какой-то overcoding получается.

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +2

      Нет, делать set метод - плохая практика. Во-первых, непонятно когда появится этот параметр и всем операциям надо его ждать. Также set метод даёт возможность подменить значение в любой момент. В моем случае параметр должен быть сразу и не меняться.
      То что в текущем варианте с ViewModel было сложно - полностью согласен, но Hilt имеет улучшения этого процесса

  • @volodymyr107
    @volodymyr107 3 роки тому

    Планируется ли подобный курс по тестированию?

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

      Нет, тема тестирования не интересует, а также я в ней не спец

  • @ЕвгенийКруглик-б8ж

    супер

  • @ДмитрийХвастунов
    @ДмитрийХвастунов 2 роки тому

    Ну незнаю. Очень сложно. Пойду курс попроще искать. Может потом вернусь.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Да, это рассчитано на Android разработчиков

    • @ДмитрийХвастунов
      @ДмитрийХвастунов 2 роки тому

      Согласен иначе зачем это смотреть. Просто после spring-а. DI в Dagger это конечно такое себе удовольствие.
      Посмотрел пару уроков по Dagger попроще. И здесь все встало на свои места.
      Спасибо за качественный контент по android.

  • @stefanserkhir6478
    @stefanserkhir6478 3 роки тому

    Спасибо за видео! Как правильно запровайдить context?

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

      Расскажу в следующем уроке про то как в граф добавлять внешние зависимости, но это делается с помощью прокидывания зависимостей во время создания компонентов

  • @slavuuhhaaa3554
    @slavuuhhaaa3554 2 роки тому +1

    ничего не понятно но очень интересно

  • @АндрейХромов-э5х

    А есть рабочий пример? С репозитория с гитхаба ничего не работает, там ни сервер недоступен, ни проекты не собираются

  • @axrorxojayodgorov3416
    @axrorxojayodgorov3416 3 роки тому

    also, could you add about upstream/downstream dependencies

  • @aydogdyaydogdiev1255
    @aydogdyaydogdiev1255 Рік тому

    во фрагменте нужно инжектить после onAttach

  • @sevenxp8858
    @sevenxp8858 3 роки тому

    Кирил один из тех людей, который помогает мне зарабатывать больше xD

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +1

      Пора начинать брать проценты )

  • @АлександрГребеньков-ы5й

    не могу запустить проект с github :(
    Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version '202.7660.26.42.7486908', please retry with version 2020.3.1 or newer.

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

      Я использовал Android Studio Arctic Fox. Она в Beta

    • @АлександрГребеньков-ы5й
      @АлександрГребеньков-ы5й 3 роки тому

      я с качал её, попробовал собрать проект вылетела новая ошибка: error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this class because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
      public final class NewsDetailsFragment extends androidx.fragment.app.Fragment
      не судите строго, навичка

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому +1

      Локально пример работает у меня. Может у вас нет инета?

  • @sabaka1305
    @sabaka1305 Рік тому

    Скажите какая тема в андроид студио используется для кода .?

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому

      Darcula

    • @sabaka1305
      @sabaka1305 Рік тому

      @@AndroidBroadcast странно . Есть доп цвета . Скобки другого цвета и тд

    • @azizbekrasulmetov9293
      @azizbekrasulmetov9293 Рік тому

      @@sabaka1305 Rainbow brackets plugin

  • @oleg12395
    @oleg12395 2 роки тому

    Что такое резолвиться ? )

    • @oleg12395
      @oleg12395 2 роки тому

      И разрезолвить ?)))

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Резолвить - выполнять запрос, решить задачу. В этом контексте по запросу найти нужную зависимость в дереве

  • @luyt2
    @luyt2 Рік тому

    Отличный ролик, но информации много сразу, мозг не успевает всё освоить. И ещё одна ложека дёгтя, слово resolved, как-то не прибавляет ясности, хотелось бы русский аналог, или небольшое его пояснение.

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому +1

      Resolved - разрешение задачи, выполнение

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому

      Так часто говорят , а нормальный русский аналог либо целое предложение или непонятное слово

    • @luyt2
      @luyt2 Рік тому

      @@AndroidBroadcast для джунов, к коим я себя отношу, не все ясно. Спасибо за контент!!

    • @AndroidBroadcast
      @AndroidBroadcast  Рік тому

      Контент не рассчитывался для начинающих, а для разработчиков с опытом. Как и весь контент

    • @luyt2
      @luyt2 Рік тому

      @@AndroidBroadcast Всё равно, спасибо за качественный материал, и успехов в работе!

  • @Chernov1984
    @Chernov1984 3 роки тому

    +

  • @Бардзо
    @Бардзо 3 роки тому +3

    Эх, чичас бы на стройку или охранником на смену выйти....

    • @AndroidBroadcast
      @AndroidBroadcast  3 роки тому

      ???

    • @jojomajo
      @jojomajo 3 роки тому

      проблемы с головой?

    • @Бардзо
      @Бардзо 3 роки тому

      @@jojomajo у тебя точно да

    • @jojomajo
      @jojomajo 3 роки тому +1

      @@Бардзо однозначно, куда мне до тебя

  • @YulyaUlyanova
    @YulyaUlyanova 2 роки тому +1

    это видео менее понятно чем предыдущее ((

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Всегда можно посмотреть ещё раз или задать вопрос в комментариях

    • @YulyaUlyanova
      @YulyaUlyanova 2 роки тому

      @@AndroidBroadcast я не поняла зачем нужен Bind (

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Он просто даёт информацию графу, что когда запрашиваетсч один тип, то нужно возвращать вот другой. Если делать такое же через provide, то это будет создавать дополнительные фабрики.
      Яркий пример использования Bind - inject интерфейса, а благодаря это аннотации можно указать какую реализацию интерыейса нужно предоставить, когда запросят зависимость.

    • @YulyaUlyanova
      @YulyaUlyanova 2 роки тому

      @@AndroidBroadcast но мне же всё равно через provide придется описывать способ получения зависимости, а в Bind нет этого описания. Зачем нужен bind если реализацию все равно нужно будет указывать и там же указать тип возращаемой зависимости.

    • @AndroidBroadcast
      @AndroidBroadcast  2 роки тому

      Нет, в граф надо будет добавить только реализацию (через аннотацию Provide в модуле или Inject над конструктором), а Bind - это просто маппинг одного типа на другой, для него не нужно Provide

  • @druce18
    @druce18 3 роки тому

    Спасибо!