СОДЕРЖАНИЕ: 00:00:00 - введение 00:00:50 - подключаем Hilt dependency injection 00:02:16 - создаем App класс для Hilt 00:04:05 - создаем модули Hilt 00:09:32 - аннотация для ViewModel (MVVM) 00:10:25 - аннотация для Activity 00:11:33 - аннотация InstallIn для модулей в Hilt DI 00:13:28 - полный обзор примера на практике 00:15:30 - запускаем пример с Hilt, MVVM и clean architecture
Очень полезное видео, особенно после того, как прочёл документацию, сделал кодлабу и все равно мало что понял. А вот теперь посмотрел и hilt лег куда надо. Спасибо👏
Если у вас появляется ошибка "Plugin [id: 'dagger.hilt.android.plugin'] was not found in any of the following sources" добавьте в корневой build.gradle (Project) вот эти строки: buildscript { /* ... */ dependencies { classpath 'com.android.tools.build:gradle:7.0.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31" classpath "com.google.dagger:hilt-android-gradle-plugin:2.42" } }
@@trolofoks9336 Можно сделать более подробный лог об ошибке в build.gradle в официальное документации про Hilt об этом говорят kapt { correctErrorTypes true }
Спасиб. Только у меня почему-то у меня hilt попросил добавить @Inject constructor в дате слое в имплементаторе интерфейса юскейсов. Добавил и все заработало
Огромное спасибо! Два вопроса: как использовать один и тот же ViewModel на двух (и более) фрагментах? Должен ли я на каждом фрагменте писать AndroidEntryPoint для инициализации вью модели?
Для этого нужно получить view model, которая привязана к жизненному циклу активити, а не фрагментов. Нужно использовать: by activityViewModels() вместо by viewModels().
При прикручивании hilt к своему проекту столкнулся со странной проблемой, у меня room через репозиторй возвращает flow , Flow примерно так. Когда создаю репозиторий во viewModel вручную flow.collect отлично отрабатывает и обновляет данные при изменении бд. а если инжекчу репозиторий через @Inject constructor, то collect отрабатывает только один раз. Мне кажеться это как то связанно с viewmodelScope.
Продебаж те жизненный цикл вью модели, станет понятно почему нет евентов после первого. Так сложно сказать что у вас не так, может с подпиской, что то не так.
Привет! Очень нравятся твои видео! Буду благодарен, если ответишь. Вопрос такой: как интегрировать в приложение androidx:navigation с помощью Hilt Dagger? Да и в целом, можно ли вообще это сделать? То есть я не могу получить объект активности, чтобы прописать findNavController().navigate(fragmentID). Такая же проблема с AllertDialog моими кастомными. Там тоже требуется активность. При попытке её заинджектить в ActivityModule с помощью @InstallIn(ActivityComponent:: class) мне выдаёт ошибку Hilt типа такого: ActivityRepository cannot be provided without an @Provides-annotated method. А если нельзя никак активность получить в Hilt, то как тогда работать со всеми функциями, которые её требуют? Если идти через view model напрямую, то будет не соответствовать clean architecture, поэтому я уже не знаю, что делать, кучу вариантов испробовал, ничего не могу понять(
Во первых, использовать androidx:navigation c XML это полная дичь на мой взгяд, это библиотека совершенно не подходит для XML, но для compose отлично. Во вторых, тема навигации - это очень сложная вещь, у нас на курсе занятие по навигации 8 часов идет, а потом еще задание на несколько недель, и даже этого может быть мало, поэтому в комментарии сложно вам ответить. Но ссылка на активити не должна покидать активити.
@@TimofeyKovalenkoСпасибо большое за такой скорый ответ! Если не сложно, подскажите ещё, что использовать в качестве переходов между фрагментами с XML? Стандартный FragmentManager или что другое?
Отличные туториалы! вопрос по архитектуре: если приложение работает с микрофоном(speechToText), то логику работы с ним нужно выносить в VM, оставлять в Activity или делать отдельным пакетом (что то типа service и провайдить в DI, а сервис использовать в VM или Activity)?
Я бы сделал это вообще отдельным модулем, который можно подключить к presentation, к фича модулю либо к тому где нужно использовать этот функционал. И дальше у модуля будет публичный API(интерфейсы, методы), а за ними уже спрятана реализация. Получится что-то вроди небольшого плагина.
видимо видос уже неактуален, а жаль, все повторил 1 в 1, но хилт выдет ошибку [Hilt] и это вся ошибка, нету ничего, ни через дебажные билды ни как еще, он просто не хочет билдится и это самое неприятное
решилось все просто по имплементации через Доки, там теперь все по другому, лучше напиши гдето в описании что имплементировать в gradle сейчас нужно как написано в доках а не как ты показал
Тимофей привет! Все перепроверил два раза и всё равно выдает ошибку public final class MainActivity extends androidx.appcompat.app.AppCompatActivity { ^ @EntryPoint ru.rayanis.cleanarchitecturelearnapp.presentation.MainActivity must also be annotated with @InstallIn Пробовал решения из стэковерфлоу ставил AndroidEndtryPoint вместо Entrypoint, и @InstallIn пробовал, только без параметра. Не помогает.
СОДЕРЖАНИЕ:
00:00:00 - введение
00:00:50 - подключаем Hilt dependency injection
00:02:16 - создаем App класс для Hilt
00:04:05 - создаем модули Hilt
00:09:32 - аннотация для ViewModel (MVVM)
00:10:25 - аннотация для Activity
00:11:33 - аннотация InstallIn для модулей в Hilt DI
00:13:28 - полный обзор примера на практике
00:15:30 - запускаем пример с Hilt, MVVM и clean architecture
супер! спасибо за понятные и разжеванные обьяснения, хотелось бы видео про многопоточность: Coroutines, RxJava
Отличный курс! Тимофей, у Вас талант объяснять сложные вещи. Спасибо большое 👍🔥
Просто изумительный плейлст!
Спасибо за видео про зависимости))
Очень полезное видео, особенно после того, как прочёл документацию, сделал кодлабу и все равно мало что понял. А вот теперь посмотрел и hilt лег куда надо. Спасибо👏
Спасибо, круто объясняете! Ждем уроки про многопоточность: Coroutines, RxJava))
Спасибо за уроки!!!
В плейлисте этот ролик стоит первым.
Да, поправил это.
Спасибо, очень круто!
Расскажите пожалуйста про assisted injection во второй части :)
Спасибо за ваш труд!
Спасибо за урок,
если есть возможность ждем уроки про Socket )))
Если у вас появляется ошибка "Plugin [id: 'dagger.hilt.android.plugin'] was not found in any of the following sources" добавьте в корневой build.gradle (Project) вот эти строки:
buildscript {
/* ... */
dependencies {
classpath 'com.android.tools.build:gradle:7.0.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31"
classpath "com.google.dagger:hilt-android-gradle-plugin:2.42"
}
}
Спасибо!!!!!!!!
Большое спасибо
Мне из всех больше понравился Hilt
1.Он простой
2.Проверка при компиляции
Только проверка просто Божеская, ошибка [Hilt] и ВСЕ, никаких указаний где что не так
@@trolofoks9336 Можно сделать более подробный лог об ошибке в build.gradle в официальное документации про Hilt об этом говорят
kapt {
correctErrorTypes true
}
Я думал мы не должны в слое presentation иметь доступ к data слою, все смотрел, ждал, вдруг в этой части будет по другому, но увы ..
Спасибо за уроки! Очень доходчиво. Планируете что-нибудь такое же по юнит тестам?
да, как раз следующее видео будет по тестам.
Спасиб. Только у меня почему-то у меня hilt попросил добавить @Inject constructor в дате слое в имплементаторе интерфейса юскейсов. Добавил и все заработало
super nice
Огромное спасибо! Два вопроса: как использовать один и тот же ViewModel на двух (и более) фрагментах? Должен ли я на каждом фрагменте писать AndroidEntryPoint для инициализации вью модели?
Для этого нужно получить view model, которая привязана к жизненному циклу активити, а не фрагментов. Нужно использовать: by activityViewModels() вместо by viewModels().
При прикручивании hilt к своему проекту столкнулся со странной проблемой, у меня room через репозиторй возвращает flow , Flow примерно так. Когда создаю репозиторий во viewModel вручную flow.collect отлично отрабатывает и обновляет данные при изменении бд. а если инжекчу репозиторий через @Inject constructor, то collect отрабатывает только один раз. Мне кажеться это как то связанно с viewmodelScope.
Продебаж те жизненный цикл вью модели, станет понятно почему нет евентов после первого. Так сложно сказать что у вас не так, может с подпиской, что то не так.
Привет! Очень нравятся твои видео! Буду благодарен, если ответишь.
Вопрос такой: как интегрировать в приложение androidx:navigation с помощью Hilt Dagger? Да и в целом, можно ли вообще это сделать? То есть я не могу получить объект активности, чтобы прописать findNavController().navigate(fragmentID). Такая же проблема с AllertDialog моими кастомными. Там тоже требуется активность. При попытке её заинджектить в ActivityModule с помощью @InstallIn(ActivityComponent:: class) мне выдаёт ошибку Hilt типа такого: ActivityRepository cannot be provided without an @Provides-annotated method.
А если нельзя никак активность получить в Hilt, то как тогда работать со всеми функциями, которые её требуют? Если идти через view model напрямую, то будет не соответствовать clean architecture, поэтому я уже не знаю, что делать, кучу вариантов испробовал, ничего не могу понять(
Во первых, использовать androidx:navigation c XML это полная дичь на мой взгяд, это библиотека совершенно не подходит для XML, но для compose отлично. Во вторых, тема навигации - это очень сложная вещь, у нас на курсе занятие по навигации 8 часов идет, а потом еще задание на несколько недель, и даже этого может быть мало, поэтому в комментарии сложно вам ответить. Но ссылка на активити не должна покидать активити.
@@TimofeyKovalenkoСпасибо большое за такой скорый ответ! Если не сложно, подскажите ещё, что использовать в качестве переходов между фрагментами с XML? Стандартный FragmentManager или что другое?
Я бы использовал стандартный FragmentManager. В этом случае придется его глубоко изучить, со всеми тонкостями, но оно того стоит.
@@TimofeyKovalenko Спасибо большое ещё раз! Будем пробовать)
Отличные туториалы! вопрос по архитектуре: если приложение работает с микрофоном(speechToText), то логику работы с ним нужно выносить в VM, оставлять в Activity или делать отдельным пакетом (что то типа service и провайдить в DI, а сервис использовать в VM или Activity)?
Я бы сделал это вообще отдельным модулем, который можно подключить к presentation, к фича модулю либо к тому где нужно использовать этот функционал. И дальше у модуля будет публичный API(интерфейсы, методы), а за ними уже спрятана реализация. Получится что-то вроди небольшого плагина.
@@TimofeyKovalenko Спасибо. я чет про модуль не додумал.
а где ссылки обещанные ?
Упс,... добавил)
6:48
видимо видос уже неактуален, а жаль, все повторил 1 в 1, но хилт выдет ошибку
[Hilt]
и это вся ошибка, нету ничего, ни через дебажные билды ни как еще, он просто не хочет билдится и это самое неприятное
решилось все просто по имплементации через Доки, там теперь все по другому, лучше напиши гдето в описании что имплементировать в gradle сейчас нужно как написано в доках а не как ты показал
root build.gradle - во время вашей демонстрации файл выглядит вовсе по другому, с чем это связано?!
Тимофей привет!
Все перепроверил два раза и всё равно выдает ошибку
public final class MainActivity extends androidx.appcompat.app.AppCompatActivity {
^
@EntryPoint ru.rayanis.cleanarchitecturelearnapp.presentation.MainActivity must also be annotated with @InstallIn
Пробовал решения из стэковерфлоу
ставил AndroidEndtryPoint вместо Entrypoint,
и @InstallIn пробовал, только без параметра.
Не помогает.