Как внедрять реализации интерфейса с помощью Dagger2?

Добрый вечер. Думал, гуглил но не нашел ответа на мой вопрос. Можете подсказать как за инжектить с помощью даггер 2 реализацию интерфейса. Есть SavedListInteractor у него реализации FavoritedListImpl, IgnoredListImpl. К примеру у меня есть 1 фрагмент с вью моделью, которая создается с помощью фабрики которая предоставляет SavedListInteractor и в зависимости от значения в аргументе фрагмента (1 или 0) и должен присвоить нужный мне экземпляр FavoritedListImpl или IgnoredListImpl. Сколько бы не гуглил не нашел ответа. Дошел лишь только до того создать несколько компонентов для фрагмента... либо 1 компонент содержащий 3 реализации.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
В билдере компонента сделай метод (название не важно)
@BindsInstance
fun bindInteractor(interactor: SavedListInteractor): Builder

когда будешь создавать компонент во фрагменте, вызовешь этот метод

https://dagger.dev/api/2.10/dagger/BindsInstance.html

Ещё можно сделать примерно так:
@Qualifier
annotation class MyFlag

@Component(modules = [InteractorModule::class])
interface MyComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun bindMyFlag(@MyFlag flag: Int): Builder
        fun build(): MyComponent
    }
    ...
}

@Module
object InteractorModule {
    @Provides 
    fun provideInteractor(@MyFlag flag: Int, impl0: Provider< FavoritedListImpl>, impl1: Provider< IgnoredListImpl>): SavedListInteractor = when (flag) {
        0 -> impl0.get()
        1 -> impl1.get()
        else -> throw IllegalArgumentExcepion("Unknown flag: $flag")
    }
}


То есть в граф суём аннотированный флаг, который приходит в аргументы(можно обойтись без аннотации, но покарают боги даггера - хуже неименованного инта в графе только неименованный инт в шине событий. Не комильфо, короче). Потом по этому флагу лениво разруливаем, какую реализацию отдать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы