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

Добрый вечер. Думал, гуглил но не нашел ответа на мой вопрос. Можете подсказать как за инжектить с помощью даггер 2 реализацию интерфейса. Есть SavedListInteractor у него реализации FavoritedListImpl, IgnoredListImpl. К примеру у меня есть 1 фрагмент с вью моделью, которая создается с помощью фабрики которая предоставляет SavedListInteractor и в зависимости от значения в аргументе фрагмента (1 или 0) и должен присвоить нужный мне экземпляр FavoritedListImpl или IgnoredListImpl. Сколько бы не гуглил не нашел ответа. Дошел лишь только до того создать несколько компонентов для фрагмента... либо 1 компонент содержащий 3 реализации.
  • Вопрос задан
  • 97 просмотров
Решения вопроса 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")
    }
}


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

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

Войти через центр авторизации
Похожие вопросы