Внедрить зависимость, которая требует параметра в конструкторе - PullRequest
0 голосов
/ 27 июня 2019

Я создаю приложение в Kotlin, используя шаблон MVP. Для этого мне нужно добавить репозиторий в моего докладчика. За исключением этого, для моего репозитория требуется интерфейс Retrofit в качестве параметра его конструктора.

Я новичок в использовании Dagger2, и ответы, найденные в Интернете, слишком сложны для такого базового случая, как мой.

Вот репозиторий, который я хочу добавить:

class RepositoryInventory(private val api: Service): IRepositoryInventory {

    override fun getInventoryItemByNum(itemnum: String): Observable<Response<Item>> {
        return api.getInventoryItemByNum(itemnum)
            .toObservable()
    }

    override fun getAllInventoryItems(): Single<Response<Item>> {
        return api.getAllInventoryItems()
    }
}

Мой компонент

@Singleton
@Component(modules = arrayOf(ActivityModule::class))
interface ActivityComponent {

    fun inject(loginActivity: LoginActivity)

    fun inject(itemDetailActivity: ItemDetailActivity)
}

Мой модуль:

@Module
class ActivityModule(private var activity: Activity) {

    @Provides
    fun provideActivity(): Activity {
        return activity
    }

    @Provides
    fun provideLoginPresenter(): LoginPresenter {
        return LoginPresenter()
    }

    @Provides
    fun provideItemDetailPresenter(): ItemDetailPresenter {
        return ItemDetailPresenter()
    }
}

В моей деятельности мой модуль вводится с помощью этого метода:

private fun injectDependency() {
        val activityComponent = DaggerActivityComponent.builder()
            .activityModule(ActivityModule(this))
            .build()

        activityComponent.inject(this)
    }

У меня есть 2 компонента и 2 модуля: один предназначен для вставки во фрагмент, а другой в действие. За исключением моего случая, я хочу внедрить в Presenter, который не является фрагментом или действием, а классом

1 Ответ

0 голосов
/ 27 июня 2019

Хорошо, я думаю, вы хотите ввести RepositoryInventory в LoginPresenter. Если это так, вы можете использовать @ContributesAndroidInjector и Binds

Сначала создайте LoginActivityModule

@Module
abstract class LoginActivityModule {

    @Binds
    abstract fun loginPresenter(loginPresenter: LoginPresenter): LoginPresenter
}

Затем создайте модуль с именем ActivityBindingModule

@Module
abstract class ActivityBindingModule {

    @ContributesAndroidInjector(modules = [LoginActivityModule::class])
    abstract fun loginActivity(): LoginActivity

    @ContributesAndroidInjector()
    abstract fun itemDetailActivity(): ItemDetailActivity
}

И измени свой ActivityComponent вот так

@Singleton
@Component(modules = arrayOf(ActivityModule::class, ActivityBindingModule::class))
interface ActivityComponent {
}

А у тебя LoginPresenter:

class LoginPresenter @Inject constructor(private val repositoryInventory: IRepositoryInventory) {
...
}

Не забудьте удалить это в ActivityModule:

@Provides
fun provideLoginPresenter(): LoginPresenter {
    return LoginPresenter()
}
...