Как использовать кинжал? Как настроить Dagger для работы в моем Android-проекте?
Я бы хотел использовать Dagger в своем Android-проекте, но это меня сбивает.
РЕДАКТИРОВАТЬ: Dagger2 также отсутствует с 2015 04 15, и это еще более сбивает с толку!
[Этот вопрос является «заглушкой», на которую я добавляю свой ответ, поскольку я узнал больше о Dagger1 и больше о Dagger2. Этот вопрос является скорее руководством , чем «вопросом».]
android
dependency-injection
dagger
dagger-2
EpicPandaForce
источник
источник
ViewModel
иPageKeyedDataSource
? Как я использую RxJava2 и хочу, чтобы CompositeDisposable совместно использовался обоими классами, и если пользователь нажимает кнопку возврата, я хочу очистить объект Disposable. Я добавил сюда случай: stackoverflow.com/questions/62595956/…ViewModel
и, возможно, передать тот же композитDisposable в качестве аргумента конструктора вашего настраиваемого PageKeyedDataSource, но я бы не стал использовать Dagger для этой части, потому что тогда вам понадобятся подкомпоненты с субкомпонентами, а Hilt на самом деле не будет поддерживать это легко для тебя.Ответы:
Руководство для Dagger 2.x (исправленное издание 6) :
Шаги следующие:
1.) добавьте
Dagger
в своиbuild.gradle
файлы:.
.
2.) Создайте свой
AppContextModule
класс, который предоставляет зависимости.3.) создайте
AppContextComponent
класс, который предоставляет интерфейс для получения классов, которые можно вводить.3.1.) Вот как бы вы создали модуль с реализацией:
Осторожно:: Вам необходимо предоставить
@Scope
аннотацию (например,@Singleton
или@ActivityScope
) к@Provides
аннотированному методу модуля, чтобы получить провайдер с заданной областью действия в сгенерированном компоненте, в противном случае он будет отключен, и вы будете получать новый экземпляр каждый раз, когда вводите.3.2.) Создайте компонент области приложения, который указывает, что вы можете вводить (это то же самое, что и
injects={MainActivity.class}
в Dagger 1.x):3.3.) Для зависимостей, которые вы можете создать через конструктор самостоятельно и не хотите переопределять с помощью
@Module
(например, вы используете разновидности сборки вместо того, чтобы изменить тип реализации), вы можете использовать@Inject
аннотированный конструктор.Кроме того, если вы используете
@Inject
конструктор, вы можете использовать внедрение поля без явного вызоваcomponent.inject(this)
:Эти
@Inject
классы-конструкторы автоматически добавляются к компоненту той же области видимости без необходимости явно указывать их в модуле.@Singleton
Области видимости@Inject
конструктора класс будет рассматриваться в@Singleton
контекстных компонентах.3.4.) После того, как вы определили конкретную реализацию для данного интерфейса, например:
Вам нужно будет «привязать» конкретную реализацию к интерфейсу с помощью
@Module
.Сокращение этого, начиная с Dagger 2.4, выглядит следующим образом:
4.) создайте
Injector
класс для обработки вашего компонента уровня приложения (он заменяет монолитныйObjectGraph
)(примечание:
Rebuild Project
для созданияDaggerApplicationComponent
класса построителя с помощью APT)5.) создайте свой
CustomApplication
класс6.) добавьте
CustomApplication
в свойAndroidManifest.xml
.7.) Добавьте свои классы в
MainActivity
8.) Наслаждайтесь!
+1.) Вы можете указать
Scope
для своих компонентов, с помощью которых вы можете создавать компоненты с областью действия . Подобласти позволяют вам предоставлять зависимости, которые вам нужны только для данной подобласти, а не для всего приложения. Как правило, каждое действие получает свой собственный модуль с этой настройкой. Обратите внимание, что для каждого компонента существует провайдер с заданной областью , то есть, чтобы сохранить экземпляр для этого действия, сам компонент должен пережить изменение конфигурации. Например, он мог выжить черезonRetainCustomNonConfigurationInstance()
прицел или миномет.Для получения дополнительной информации о субобласти ознакомьтесь с руководством Google . Также посетите этот сайт о методах предоставления, а также раздел о зависимостях компонентов ) и здесь .
Чтобы создать настраиваемую область, вы должны указать аннотацию квалификатора области:
Чтобы создать подобласть, вам необходимо указать область на вашем компоненте и указать
ApplicationComponent
ее как зависимость. Очевидно, вам также необходимо указать подобласть в методах поставщика модуля.И
Обратите внимание, что в качестве зависимости можно указать только один компонент с ограниченной областью действия. Подумайте об этом точно так же, как в Java не поддерживается множественное наследование.
+2.) О
@Subcomponent
: по сути, область видимости@Subcomponent
может заменить зависимость компонента; но вместо того, чтобы использовать построитель, предоставляемый обработчиком аннотаций, вам нужно будет использовать метод фабрики компонентов.Итак, это:
Становится это:
И это:
Становится это:
+3.): Пожалуйста, ответьте на другие вопросы о переполнении стека, касающиеся Dagger2, они предоставляют много информации. Например, в этом ответе указана моя текущая структура Dagger2 .
Спасибо
Спасибо за руководства в Github , TutsPlus , Joe Steele , Froger MCS и Google .
Также я нашел это пошаговое руководство по миграции после написания этого сообщения.
И за пояснение объема Кирилла.
Еще больше информации в официальной документации .
источник
DaggerApplicationComponent
APT при сборке, но я добавлю его.Руководство для Dagger 1.x :
Шаги следующие:
1.) добавить
Dagger
вbuild.gradle
файл для зависимостейКроме того, добавьте,
packaging-option
чтобы предотвратить ошибку оduplicate APKs
.2.) создайте
Injector
класс для обработкиObjectGraph
.3.) Создайте,
RootModule
чтобы связать ваши будущие модули вместе. Обратите внимание, что вы должныinjects
указать, чтобы указать каждый класс, в котором вы будете использовать@Inject
аннотацию, потому что в противном случае Dagger выбрасываетRuntimeException
.4.) Если у вас есть другие подмодули в ваших модулях, указанных в вашем Root, создайте модули для них:
5.) создайте оконечные модули, которые получают зависимости в качестве параметров конструктора. В моем случае не было циклической зависимости, поэтому я не знаю, сможет ли Dagger решить эту проблему, но считаю это маловероятным. Параметры конструктора также должны быть предоставлены в модуле от Dagger, если вы укажете,
complete = false
он также может быть в других модулях.6.) Расширьте
Application
и инициализируйтеInjector
.7.) В вашем методе
MainActivity
вызовите InjectoronCreate()
.8.) Используйте
@Inject
в своемMainActivity
.Если вы получили сообщение об ошибке
no injectable constructor found
, убедитесь, что вы не забыли@Provides
аннотации.источник
Android Bootstrap
. Итак, спасибо им за то, что они это выяснили. Решение используетDagger v1.2.2
.dagger-compiler
должен бытьprovided
иначе он будет включен в приложение, и это под лицензией GPL.