💰 Поддержать проект на Boosty bit.ly/3sratqQ или Patreon patreon.com/android_broadcast 🔗 Telegram канал "Android Broadcast" ttttt.me/android_broadcast Видео сделано при поддержке Лаборатории Касперского
@qIKraytonIp3 жыл бұрын
Пожалуй одна из самых ценных серий видео-уроков, что я видел, жду 3ю часть
@yakiv14883 жыл бұрын
Курс бомбический! Это лучшее объяснение Dagger из всего что я видел!
@divanlobkowski34733 жыл бұрын
Самое быстрое объяснение dagger на диком западе.
@uservhhrXdgko12343 жыл бұрын
Боже какой же топовый расклад. Это просто божественно, дай бог тебе здоровья)
@grigoriy36153 жыл бұрын
Спасибо за видео. Такие видео очень нужны!!!
@vladimirdaryin93513 жыл бұрын
Благодарю, уже сколько лет работа с Dagger оставляет ощущение, что что-то не до конца понимаешь, эти уроки помогли прояснить общую картину + пару новых удобных моментов себе в проекты утяну, спасибо! 🙏🏻
@AndroidBroadcast3 жыл бұрын
Супер! Значит у курса получается делать что нужно
@sonar_devices3 жыл бұрын
Большое спасибо. Очень интересно.
@AndroidBroadcast3 жыл бұрын
Спасибо!
@МобильныйРазработчик-ъ3с2 жыл бұрын
Было очень интересно,большое спасибо!
@ИванИванов-в4н9п2 жыл бұрын
Фабрика для фабрики, квалификатор с названием "квалификатор". Ошибка BNR (Brain Not Responding) =) Если серьезно, то согласен с другими зрителями, что видосы у Кирилла топ! Давно смотрю.
@codemachine19 Жыл бұрын
Непросто урок, но подача очень интересная. Спасибо за материал!
@immortal_lnight2 жыл бұрын
Хоть временами и сложно понять что-то, но спасибо за проделанную работу, Кирилл!
@KudashovDev3 жыл бұрын
Круто! Самое доступное и понятное объяснение дагера)
@Mozartnab2 жыл бұрын
Спасибо тебе, добрый человек, курс по дагеру оч крутой и подробный! Хоть с первого раза я нефига не понял до конца, но благо можно смотреть заново, пока не разберешься...
@AndroidBroadcast2 жыл бұрын
Задавай вопросы, я буду отвечать в комментария
@Mozartnab2 жыл бұрын
@@AndroidBroadcast Решил для себя, что нужно сначала разобраться с нативным дагером. А потом уже смотреть в сторону хилта и т.д. Так как я еще совсем джун, и мне нужно знать как это все работает. Сейчас думаю над архитектурой. Я правильно понимаю, что для большинства прложений схема такая. 1 главный апп компонент, который подтягивает все зависимости ему необходимые, и по компоненту на каждую фичу, которые в свою очередь подтягивают все зависимости, которые нужны в этой фиче?
@Mozartnab2 жыл бұрын
и как это должно по хорошему в проекте выглядеть? типо условно папка Даггер, там хранятся компоненты, а внутри компонентов уже модули интерфейсы инджект, скоупы и т.д. Или папка дагер и там 3 папки компоненты, модули, скоупы.
@Mozartnab2 жыл бұрын
Еще вот у меня есть Продуктпрезентер, в который инжектится модель продукта и создает инстанс модели на основе входящего параметра из базы данных экземпляра продукта, я правильно понял, что этот экземпляр продукта, лучше реализовать с помощью асистед инжекта?
@Mozartnab2 жыл бұрын
@@AndroidBroadcast Извиняюсь за нубские вопросы, заранее спасибо.
@ЕгорПоляков-т5ъ3 жыл бұрын
Спасибо большое за курсы, очень приятно слушать профессионала своего дела)
@sergeyjoke Жыл бұрын
Спасибо. Очень хороший курс. Очень!
@UCfpBnsCG17QVj5bLvbBjBrQ2 жыл бұрын
Очень классный курс, важно не только посмотреть но и попробовать все что в нем рассказывается. Больше спасибо за труд 🙏
@MikhailGureev3 жыл бұрын
Большое спасибо, Кирилл.
@alexiachimov98173 жыл бұрын
Спасибо за потрясный контент Кирилл. Не смог пройти мимо такого отличного канала по Android разработке. Обязательно оформлю подписку на Boosty что бы поддержать! Продолжайте в том же духе, успехов и удачи!
@AndroidBroadcast3 жыл бұрын
Спасибо! Очень приятно читать такие комменты
@mukhtarbimurat51063 жыл бұрын
Спасибо, очень полезно, еще хотелось узнать как правильно заменить prod на stage ретрофит в зависимости от какого то конфига (допустим BuildConfig.DEBUG) не меняя остальные деклараций(такие как репозиторий, use case и т.д)
@AndroidBroadcast3 жыл бұрын
Я предпочитаю это делать через прокидывание параметра при создании Component. Будет показано в следующем уроке
@mitiaygorodov49393 жыл бұрын
@@AndroidBroadcast А если эту переменную прописать в градле, и при переключении типа сборки оно автоматически меняло значение на нужное? Этот подход имеет место быть?
@lemarkmain17133 жыл бұрын
Спасибо, как раз то что нужно!
@andrew39372 жыл бұрын
А как на 23:13 создается viewModel, если на тот момент factory еще не заинжекчена. Одно происходит в момент создания класса, второе только в onAttach(). Я не оч понимаю, подскажите, пожалста.
@AndroidBroadcast2 жыл бұрын
Она создаётся только при первом обращении к ней, а дальше сохраняется. Если вы до inject не обратитесь к ViewModel, то все будет хорошо
@azatnabiullin22632 жыл бұрын
На мой взгляд, плейлист про Dagger у Coding in Flow намного более последовательный и понятный. Хотя, возможно, курс Кирилла предназначен для более продвинутой аудитории. Многие вещи не объясняются, словно их понимание само самой разумеется, поэтому после этого курса есть риск использования их вслепую, потому что Кирилл так написал)
@AndroidBroadcast2 жыл бұрын
У меня весь канал не про новичков, а разработчиков с уже каким-то пониманием технологий. Любой курс имеет свою специфику, подачу, трансляцию опыта и авторский взгляд
@denislopatkin69967 ай бұрын
В кодлабе по даггеру пишется что инжектить фрагмент в онаттач надо именно после вызова родительского аттача, а вот активити - до.
@Mozartnab2 жыл бұрын
А еще вопрос, я тут делаю универсальный метод по созданию компонента через рефлексию, и хочу составить стрингу из Dagger + название компонента. Но тут возникает проблема, дагер иногда генерирует свой класс, как в названии компонента, а иногда использует нижнее подчеркивание. Вот пример - DaggerProductPresenter_Component и DaggerDataManagerComponent почему в одном так в другом так, от чего это зависит и есть ли еще вариации таких классов?
@AndroidBroadcast2 жыл бұрын
Это внутренние классы, нет никаких гарантий их названий и они могут меняться от версии к версии, как и вовсе исчезнуть
@Mozartnab2 жыл бұрын
@@AndroidBroadcast понятно, спасибо, а как тогда лучше сделать универсальный метод createComponent?
@Mozartnab2 жыл бұрын
типо метод, который принимает в себя класс, который нужно создать, список модулей и список зависимостей
@AndroidBroadcast2 жыл бұрын
Это слишком общая задача в которой нет ограничений на выходные параметры. Лучше создавать их без рефлексии обычным способом. Это будет надёжнее и безопаснее при изменении API
@beginnercoding10893 жыл бұрын
Спасибо большое за урок!
@Александр-м7о7т3 жыл бұрын
Очень крутой курс Спасибо
@epicarchitect2 жыл бұрын
Спасибо за урок но у меня возник вопрос тут 7:07. Почему писать анотацию инжект лучше в конструктор а не в модуле делать функцию с провайд анотацией? Тогда ведь весь диай будет размазан по приложению.
@AndroidBroadcast2 жыл бұрын
Тогда зависимости не будут зависеть от графа и легче переносить код по модулям
@kirill60203 жыл бұрын
Спасибо за видео!
@AndroidBroadcast3 жыл бұрын
Рад стараться!
@antony50922 жыл бұрын
Все круто, но не совсем понимаю для чего на 4 минуте добавлять 2 provides для newsRepository. Dagger позволяет же указывать возвращаемый абстрактный тип, но на самом деле возвращаеть его реализацию.
@GriNAME2 жыл бұрын
Эх, хороший курс)
@ljlj Жыл бұрын
Как использовать assisted inject, чтобы получить репозиторий в usecase, когда он находится в модуле, в котором нет даггера, до этого момента он там не нужен был вообще, так как usecase резолвились в модуле, который app
@AndroidBroadcast Жыл бұрын
Вы должны добавить репозиторий в граф: либо модуль и Provide, либо Bind при создании компонента или другие способы
@MrPwnzrus3 жыл бұрын
Спасибо , очень познавательно!!!
@axrorxojayodgorov34163 жыл бұрын
Thank you, really helpful tutorial
@volodymyr1073 жыл бұрын
Планируется ли подобный курс по тестированию?
@AndroidBroadcast3 жыл бұрын
Нет, тема тестирования не интересует, а также я в ней не спец
@Capitistrum Жыл бұрын
Спасибо за курс! После просмотра начало понимание приходить как устроен Dagger и DI в принципе Вопрос по Inject в метод. Как понял из видео, при аннотации @Inject метод будет выполнен автоматически один раз. А если мне не нужно его выполнение? Например, он должен выполниться при определенных условиях, иначе нет. И есть зависимость которая необходима только ему в классе. Так как метод может и не выполнится, кажется логичным не держать в поле ссылку на необходимую зависимость. Или получается все же в поле хранить?🤔
@AndroidBroadcast Жыл бұрын
Можно делать Inject в методе или в конструктор
@Capitistrum Жыл бұрын
@@AndroidBroadcast да, это я понял. Если делать Inject в метод - то этот метод будет 100% выполнен при инициализации класса? Нет варианта чтобы он не выполнялся автоматически, а по необходимости?
@dmtrlbdv3 жыл бұрын
хорошо бы ссылки на предыдущие и следующие уроки
@AndroidBroadcast3 жыл бұрын
В описании плейлист со всеми видео
@inex5503 жыл бұрын
Топ. Просто топ.
@essohaitch81473 жыл бұрын
Отличный ролик
@sabaka1305 Жыл бұрын
Скажите какая тема в андроид студио используется для кода .?
@AndroidBroadcast Жыл бұрын
Darcula
@sabaka1305 Жыл бұрын
@@AndroidBroadcast странно . Есть доп цвета . Скобки другого цвета и тд
@azizbekrasulmetov9293 Жыл бұрын
@@sabaka1305 Rainbow brackets plugin
@handleftman3 жыл бұрын
Спасибо за урок! а код viewModel не слишком ли запутанный? где-то видел и даже использовал реализацию фабрики как синглтон в даггере. Надеюсь это будет в следующих частях видео :)
@AndroidBroadcast3 жыл бұрын
Да, пример не лучший, но жизненный. Такую сложность оптимизировали в Hilt и вот там уже проще
@deadchannal3 жыл бұрын
А какие плагины для Android Studio вы используете?
@AndroidBroadcast3 жыл бұрын
Надо снять видео отдельное на эту тему
@aliaksandr_chaulytka3 жыл бұрын
🔝🔝🔝 При Lazy инстанс кэшируется только для конкретного места (активити/фрагмента) или как ? Как вообще инстансы создаются в даггере? По умолчанию все синглтоны или фабрики? (В коине это сразу в DSL указывается, вот у меня и возник такой вопрос)
@AndroidBroadcast3 жыл бұрын
Да, в графе кэширование настраивается через Scope (будет в уроке 3). Lazy получает зависимость из графа и кеширует ее внутри себя, чтобы при следующем запросе не ходить за ней снова.
@FoRGeish3 жыл бұрын
Не очень понял, почему в качестве основного способа показан избыточный с добавлением метода provide*_to_*, а нормальный рабочий вариант в виде небольшой сноски?
@AndroidBroadcast3 жыл бұрын
Я таким подходом не пользуюсь, поэтому забыл про него сказать, а во время монтажа вспомнил, поэтому и добавил сноской
@druce183 жыл бұрын
Спасибо!
@deo56862 жыл бұрын
Приветствую, спасибо за такой хороший курс. У меня есть вопрос, - @Inject constructor в domain, насколько это удобно, а если мы разрабатываем не только для андроида, не будут ли с этим проблемы? Я может многого не знаю, но мне кажется, если бы мы объявили явно все provides, - это было бы более лаконично, так как мы оставим зависимости все что связанно с di только в app модуле. Спасибо.
@AndroidBroadcast2 жыл бұрын
Аннотация Inject не является части Dagger, а она часть JSR 330. Это переносится в рамках любого решения на Java
@andreikravchenko56128 ай бұрын
На видео ошибка. Lazy не работает для типов, которые отмечены @AssistedFactory, соответственно сделать фабрику фабрики вьюмодели как на видео нельзя, после запуска будет ошибка: Dagger does not support injecting Lazy, Producer, or Produced when T is an @AssistedFactory-annotated type
@GarcianSmt3 жыл бұрын
Я правильно понимаю, что при желании можно использовать только provides вместо binds, и это лишь дело вкуса?
@AndroidBroadcast3 жыл бұрын
Да, все верно
@staschernov9282 жыл бұрын
А можно, пожалуйста, выкладывать и сами проекты? А то по краткому обзору вначале невозможно все запомнить, и чтобы понять, о чем идет речь, приходится дублировать вкладку и смотреть 2 разных таймкода.
@AndroidBroadcast2 жыл бұрын
Ссылки в описании к видео разве нет?
@staschernov9282 жыл бұрын
@@AndroidBroadcast ага, нашел, спасибо. В первый раз, видимо, проглядел.
@ildar22443 жыл бұрын
Спасибо за труд - очень полезно. В описании к видео ссылка на "Курс по Dagger 2" выдаёт результат что плейлист не существует.
@AndroidBroadcast3 жыл бұрын
Исправил
@axrorxojayodgorov34163 жыл бұрын
also, could you add about upstream/downstream dependencies
@AndroidBroadcast3 жыл бұрын
What is that?
@kirillvolkov85563 жыл бұрын
в новых версиях работа с AssistedFactory невозможна с делегатами
@AndroidBroadcast3 жыл бұрын
Можно больше информации. Что именно невозможно иэ кода сделать?
@legioncommander72613 жыл бұрын
А как так работает AssistedFactory? Это же интерфейс, где прописывается реализация?
@AndroidBroadcast3 жыл бұрын
Реализация генерится, как и реализация Component в Dagger
@ЕвгенийКруглик-б8ж3 жыл бұрын
супер
@slavuuhhaaa35543 жыл бұрын
ничего не понятно но очень интересно
@deadchannal3 жыл бұрын
Ккк, прикольно!
@stefanserkhir64783 жыл бұрын
Спасибо за видео! Как правильно запровайдить context?
@AndroidBroadcast3 жыл бұрын
Расскажу в следующем уроке про то как в граф добавлять внешние зависимости, но это делается с помощью прокидывания зависимостей во время создания компонентов
@olegleonov13103 жыл бұрын
Так, а почему бы вместо фабрики фабрик не сделать setNewsId для viewModel? И не делать newsId в конструкторе. А то какой-то overcoding получается.
@AndroidBroadcast3 жыл бұрын
Нет, делать set метод - плохая практика. Во-первых, непонятно когда появится этот параметр и всем операциям надо его ждать. Также set метод даёт возможность подменить значение в любой момент. В моем случае параметр должен быть сразу и не меняться. То что в текущем варианте с ViewModel было сложно - полностью согласен, но Hilt имеет улучшения этого процесса
@aydogdyaydogdiev12552 жыл бұрын
во фрагменте нужно инжектить после onAttach
@AndroidBroadcast2 жыл бұрын
Почему?
@АлександрГребеньков-ы5й3 жыл бұрын
не могу запустить проект с 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.
@AndroidBroadcast3 жыл бұрын
Я использовал Android Studio Arctic Fox. Она в Beta
@АлександрГребеньков-ы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 не судите строго, навичка
@AndroidBroadcast3 жыл бұрын
Локально пример работает у меня. Может у вас нет инета?
@ДмитрийХвастунов3 жыл бұрын
Ну незнаю. Очень сложно. Пойду курс попроще искать. Может потом вернусь.
@AndroidBroadcast3 жыл бұрын
Да, это рассчитано на Android разработчиков
@ДмитрийХвастунов3 жыл бұрын
Согласен иначе зачем это смотреть. Просто после spring-а. DI в Dagger это конечно такое себе удовольствие. Посмотрел пару уроков по Dagger попроще. И здесь все встало на свои места. Спасибо за качественный контент по android.
@oleg123952 жыл бұрын
Что такое резолвиться ? )
@oleg123952 жыл бұрын
И разрезолвить ?)))
@AndroidBroadcast2 жыл бұрын
Резолвить - выполнять запрос, решить задачу. В этом контексте по запросу найти нужную зависимость в дереве
@sevenxp88583 жыл бұрын
Кирил один из тех людей, который помогает мне зарабатывать больше xD
@AndroidBroadcast3 жыл бұрын
Пора начинать брать проценты )
@АндрейХромов-э5х Жыл бұрын
А есть рабочий пример? С репозитория с гитхаба ничего не работает, там ни сервер недоступен, ни проекты не собираются
@luyt2 Жыл бұрын
Отличный ролик, но информации много сразу, мозг не успевает всё освоить. И ещё одна ложека дёгтя, слово resolved, как-то не прибавляет ясности, хотелось бы русский аналог, или небольшое его пояснение.
@AndroidBroadcast Жыл бұрын
Resolved - разрешение задачи, выполнение
@AndroidBroadcast Жыл бұрын
Так часто говорят , а нормальный русский аналог либо целое предложение или непонятное слово
@luyt2 Жыл бұрын
@@AndroidBroadcast для джунов, к коим я себя отношу, не все ясно. Спасибо за контент!!
@AndroidBroadcast Жыл бұрын
Контент не рассчитывался для начинающих, а для разработчиков с опытом. Как и весь контент
@luyt2 Жыл бұрын
@@AndroidBroadcast Всё равно, спасибо за качественный материал, и успехов в работе!
@YulyaUlyanova2 жыл бұрын
это видео менее понятно чем предыдущее ((
@AndroidBroadcast2 жыл бұрын
Всегда можно посмотреть ещё раз или задать вопрос в комментариях
@YulyaUlyanova2 жыл бұрын
@@AndroidBroadcast я не поняла зачем нужен Bind (
@AndroidBroadcast2 жыл бұрын
Он просто даёт информацию графу, что когда запрашиваетсч один тип, то нужно возвращать вот другой. Если делать такое же через provide, то это будет создавать дополнительные фабрики. Яркий пример использования Bind - inject интерфейса, а благодаря это аннотации можно указать какую реализацию интерыейса нужно предоставить, когда запросят зависимость.
@YulyaUlyanova2 жыл бұрын
@@AndroidBroadcast но мне же всё равно через provide придется описывать способ получения зависимости, а в Bind нет этого описания. Зачем нужен bind если реализацию все равно нужно будет указывать и там же указать тип возращаемой зависимости.
@AndroidBroadcast2 жыл бұрын
Нет, в граф надо будет добавить только реализацию (через аннотацию Provide в модуле или Inject над конструктором), а Bind - это просто маппинг одного типа на другой, для него не нужно Provide
@Бардзо3 жыл бұрын
Эх, чичас бы на стройку или охранником на смену выйти....