在构造函数中注入需要参数的依赖项

时间:2019-06-27 07:36:08

标签: android kotlin dagger-2

我正在使用MVP模式在Kotlin中创建一个应用程序。 为此,我需要将存储库注入到Presenter中。除此之外,我的存储库需要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 :(得分:0)

好吧,我的猜测是您想将RepositoryInventory注入LoginPresenter中。如果是这样,您可以使用@ContributesAndroidInjectorBinds

首先,创建一个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()
}