我正在使用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。
答案 0 :(得分:0)
好吧,我的猜测是您想将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()
}