StartAndroid Ru Dagger 2
@daggerchat 246 участников
Загрузить еще
20 апреля
Если ты понимаешь проблему, тогда обучение проходит намного быстрее и проще
7 мая
Всем привет!Подскижите с чем это связано в компонете простисал fun inject (app:App) ?
10 мая
Привет! У кого то есть ссылка на статью или сампл на гитхабе, как использовать Dagger2 и ViewModel гугловские?
Спасибо за статью, буду читать))
Отличная статья, которая детально объясняет, какую проблему решает Dagger 2 и поэтапное введение : https://habrahabr.ru/post/345898/
https://m.habr.com/post/279125/
Привет! У кого то есть ссылка на статью или сампл на гитхабе, как использовать Dagger2 и ViewModel гугловские?
11 мая
спасибо за ститью, но меня интересует как именно инжектить ViewModel с библиотеки гугл architecture components в активити или фрагменты. Так как там нужно использовать ViewModelProvider.of(context).get(ViewModel::class). У меня есть варианты как это сдеелать, но хотелось бы посмотреть бест практис или что то вроде того
16 мая
Привет.Почему при использовании контекста из AppComponent не может найти тему?
@Module
class AndroidModule(private val application: Application) {
@Provides
@Singleton
fun provideApplicationContext(): Context = application

}
В репозитории
init {
ShopitApp.applicationComponent.inject(this)
}
override fun getContext(): Context {
return applicationComponent.getContext()
}
Но при использовании
repository.getContext()
Приложение падает т.к. не может найти тему
IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
Ошибка связана с тем,что AlertDialog builder использует тему
.Если используешь контект активити,то все норм
17 мая
Вроде у App Context-а нет данных по теме
Попробуйте контекст активити передать
Мне кажется что с этим связано. https://2ed08586-a-62cb3a1a-s-sites.googlegroups.com/site/terrylai14/home/android-context-yuan-li/0_1330607569Vj4c.gif?attachauth=ANoY7cqKiGd8aIzXKG2f-vL7HmErusXzWhbSifZtgLSgFbB3jW6kBDVYvroLwa__v5mI3bkyZlFZs7iM90NitaeRqj9AWUUxVbCZzMea52t2YLjThVGip7U9oJ3_JyUQe9xeCGp00TCMvqe4Iwzs5eaZPQ9qKw3AbaNXZstUlFWt7f6Pvl02Ohrgpn9wIj9DPNfiIgcZsUIV2YIfdscAdrp7KBmnaq4eG-kNKhKWxHV9_247FZY9oU2PgV3Gt21a91ZWIwSuaMp6&attredirects=0
31 мая
Ребята, нид ассистанс! =)
Термины:
Модуль - отдельная библиотека в проекте андроид-студии
Module - класс даггера, помеченный аннотацией
@Module

Дано:
Модуль
domain
, в котором есть:
- интерфейс```Repo```, с одним методом:
getId()
- класс
IdUsecase(repo: Repo)
, с методом
fetchId()
.
Модуль
data
, в котором есть:
- класс
IdStorage(prefs: SharedPreferences)
- метод, создающий нужный мне
OkHttpClient
- класс
MyRepo(storage: IdStorage, client: OkHttpClient): Repo
Модуль
presentation
, в котором будет использоваться IdUsecase

Надо (хочется):
Даггером заинжектить в нужных местах
IdUsecase
в
presentation
модуле.

Вопросы:
1. Нужно ли тащить либы даггера в модуль
data
? И можно ли? А в
domain
?
То есть, хочется уметь в
presentation
модуле делать такой Provide-метод, в который я просто передам контекст (для шаредпреф), а на выходе получу
IdUsecase
2. Если OkHttpClient инжектить, а не прописывать явно в создании репозитория, то где это лучше делать? А если OkHttpClient-а у меня два? Один для авторизации, а второй - для запросов (и в разных юзкейсах будет использоваться разные клиенты)?
Ребята, нид ассистанс! =)
Термины:
Модуль - отдельная библиотека в проекте андроид-студии
Module - класс даггера, помеченный аннотацией @Module
Дано:
Модуль domain , в котором есть:
- интерфейс Repo, с одним методом: getId()
- класс IdUsecase(repo: Repo), с методом fetchId()
Модуль data, в котором есть:
- класс IdStorage(prefs: SharedPreferences)
- метод, создающий нужный мне OkHttpClient
- класс MyRepo(storage: IdStorage, client: OkHttpClient): Repo
Модуль presentation , в котором будет использоваться IdUsecase

Надо (хочется):
Даггером заинжектить в нужных местах IdUsecase в presentation модуле.

Вопросы:
1. Нужно ли тащить либы даггера в модуль data? И можно ли? А в domain ?
То есть, хочется уметь в presentation модуле делать такой Provide-метод, в который я просто передам контекст (для шаредпреф), а на выходе получу IdUsecase
2. Если OkHttpClient инжектить, а не прописывать явно в создании репозитория, то где это лучше делать? А если OkHttpClient-а у меня два? Один для авторизации, а второй - для запросов (и в разных юзкейсах будет использоваться разные клиенты)?
1) В domain мне кажется даггер не нуже., В data вполне может быть. А может и не быть. Тут как удобнее. Можно все components и module держать в presentation.
Мне кажется, здесь нет однозначного решения.

2) Если 2 OkHttpClient , то @Named поможет разрулить их.
Насчет где - не очень понял вопрос. Можно провайдить их в каком-нить module, и даггер будет юзать их при создании репозиториев.
Идея такая: в дате несколько репозиториев, которые собираются внутри по каким-то правилам, которе снаружи библиотеки никому знать не обязательно. Типа такого АПИ:
RepoOne(context: Context): IRepoOne
RepoTwo(context: Context): IRepoTwo
RepoThree(context: Context): IRepoThree
Причем интерфейсы описаны в домене, но логику взаимосвязи вспомогательных классов для репозиториев (типа httpClient-ов) хочется спрятать под капотом data модуля.
Если в data использовать даггер (напрммер, для инжекта нужного httpClient), то это может быть отдельный граф, о котором presentation не будет ничего знать? И если да, как корректно создать компоненту в data и к чему привязать ее время жизни?
Т.е. чтобы потом в Presentation модуле можно было написать такой Provide-метод:

@Provide
@Singleton
fun repoOneProvider(context:Context): RepoOne = RepoOne(context)

НО! Не вносить в Presentation модуль com.squareup.okhttp3:okhttp зависимость (так, чтобы вообще этот модуль не знал про существование класса OkHttpClien)
Вроде-бы, первый ответ в этом вопросе на SO похож на то, что мне надо, если эта схема рабочая:
https://stackoverflow.com/questions/26833389/how-to-use-dagger-in-a-android-library-project?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

Есть два вопроса:
1. Не будет ли конфликтов при компиляции, если проект, который будет использовать мою data-библиотеку, тоже использует даггер? То есть, дерево зависимостей data модуля и presentation модуля смогут сосуществовать независимо друг от друга?
2. Тот же вопрос, но в зависимостях data и presentation модуля будут разные версии даггера. Чисто теоретически интересно, соберется ли и будет ли работать? И если так, то в апк зашьется две версии даггер-библиотеки?
1 июня
Ребята, сорян, что тут такие портянки длинные кидаю =)
Еще вопрос появился.

Вот такой модуль работает:
@Module
abstract class TestModule {
@Binds
@PerActivity
abstract fun provideA(a: A): AA
}
interface AA {}
class A @Inject constructor() : AA {}

А вот такой:
@Module
abstract class TestModule {
@Provides
@PerActivity
fun provideA(): A = A()
}
class A (){}
Не работает, дает такую ошибку:
di.modules.A cannot be provided without an @Inject constructor or an @Provides-annotated method.
Почему второй не работает?
Поковырялся еще.

Так работает:
@Module
class TestModule {
@Provides
@PerActivity
fun provideA(): A = A()
}
class A @Inject constructor() {}

Так нет:
@Module
class TestModule {
@Provides
@PerActivity
fun provideA(): A = A()
}
class A () {}
Да, забыл сказать, этот модуль я подключаю в сабкомпоненту активити:

@Module
abstract class ActivityModule {
@PerActivity
@ContributesAndroidInjector(modules = [TestModule::class])
abstract fun MyActivity(): MyActivity
}
7 июня
С чего надо начать поиск причины почему не генерится DaggerAppComponent?
может аннотаацию упустил или не всё подключил правильно
в логах что то должно быть, что можно загуглить
В логах компилятора я то вижу что не находится класс DaggerAppComp. Мне бы как-нибудь логи процессора анотауий просмотреть. Потому что визуально по коду я не могу ничего найти
может сам процессор куда-нибудь пичет что ему не хватает. Хоть как-то бы мне намекнул
Да и вообще на будущее интересно узнать как процессинг анотаций проходит не только в dagger но и вообще. Наверняка они тоже пишут какие-то логи
Ошибку в итоге нашел, но всеравно хотелось что бы как-то дагер подсказывал
15 июня
Есть класс-синглтон, который конвертит строки json в pojo объекты. Нужно ли в него инжектить Gson или можно оставить создание внутри? Если нужно инжектить то поясните пожалуйста для каких целей?
Вот пример класса https://pastebin.com/NxJT2n4N
19 июня
привет, а расскажите пожалуйста про даггер, что спрашивают на собеседовании про него
20 июня
Спрашивают что такое дагер
А ты отвечаешь , либо это .... или говоришь хз, я не в курсе ребята
Есть какой-то годный курс по даггеру? Или должно хватить документации?
Документация тяжелая, цикл статей на хабре отличный:
https://habr.com/post/279125/
21 июня
Alexey спасибо, прочитаю :)
Всем привет, подскажите пожалуйста, хочу заинжектить provideUsersDatabaseReference, но посколько они одного типа что и первый как это можно сделать не прибегая к get методам ?
727775239
729185287
Telegram виджет для вашего сайта (скрыть это)