Это простая Java. У вас есть объект независимо от того, где. Объект предоставляет вам зависимости. Если вы используете один и тот же экземпляр, у вас будут те же зависимости или в основном та же «Область действия / время жизни». Если вы создаете где-то новый объект, это означает новый другой объект \ зависимости, которые он может предоставить, так что «другая область действия / время жизни». Если вы разделяете объект между различными объектами (вы создаете его в классе Application, но повторно используете его в другом фрагменте), вы находитесь в «той же области действия / времени жизни».
Но в целом я вижу только «старый способ» использования Dagger 2 здесь. Вот так ваши занятия должны заканчиваться повсюду. Нет необходимости искать ссылки на какие-либо Компоненты и т. Д. Или пытаться создавать их экземпляры самостоятельно или очищать их самостоятельно в Фрагментах или Актуальностях. У вас есть некоторый код для Dagger 2 в одном месте, а затем несколько аннотаций в ваших классах, «которые выполняют реальную работу вашего проекта». Нет необходимости в сложной "связи" между двумя частями, и я вижу здесь много подобных случаев, которые являются частью учебных пособий, которые относятся к 2016-2017 гг. ...
class Repostory @Inject constructor(
private val dependency1: Dependency1
) {}
class Activity or Fragment {
@Inject lateinit var dependency2: Dependency2
}
Это отличный примердля правильного использования Dagger2.
https://github.com/google/iosched
Вот статья о приложении:
https://medium.com/@JoseAlcerreca
Хосе Альсеррека является одним изGoogle Lead Devs отвечает за создание руководств по написанию приложений для Android.
@Module
abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(modules = [MainActivityModule::class])
internal abstract fun mainActivity(): MainActivity
}
Просто попробуйте скомпилировать что-нибудь подобное. В приложении, которое я вам дал, есть такой же класс. Проверьте сгенерированный код, а также документы. Если вы видите ContributesAndroidInjector, там объясняется:
Создает {@link AndroidInjector} для возвращаемого типа этого метода. Инжектор реализован с помощью {@link dagger.Subcomponent} и будет дочерним по отношению к компоненту {@link dagger.Module}.
Если вы посмотрите документы AndroidInjector, вы увидите, чтоэто тот, кто вводит активность. И там будет реализация:
@Subcomponent(modules = {MainActivityModule.class})
@ActivityScoped
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
Так что в общем эти аннотации делают магию для вас, когда начинается новое действие. Они создают подкомпонент, используют его, и когда жизненный цикл действия заканчивается, подкомпонент также не работает. Кинжал очищает ссылку. Кинжал знает, как работают Деятельности или Фрагменты и т. Д. Был старый способ, когда вы создаете компонент в Деятельности, используете его, вызываете инъекцию самостоятельно. Или поместите какой-нибудь компонент в AppClass, а затем очистите его на своем компьютере. Но теперь есть больше аннотаций.