我们可以像使用匕首一样在Presenter中使用“牙签”注入“视图”吗?

时间:2019-07-28 14:35:17

标签: android kotlin dependency-injection dagger toothpick-di

在Dagger中,您可以在 Presenter 中将您的activity注入为 View ,请遵循以下示例

启动模块

@Module
class SplashModule {
    @Provides
    fun provideXUseCase(
        xRepository: XRepository
    ) = XUseCase(xRepository)


    @Provides
    fun provideSplashPresenter(
        view: SplashView,
        xUseCase: XUseCase
    ): SplashPresenter = SplashPresenter(
        view,
        xUseCase
    )
}

查看模块

@Module
abstract class ViewModule {
    @Binds
    abstract fun provideSplashView(activity: SplashActivity): SplashView
}

活动模块

@Module
abstract class ActivitiesModule {
    @ContributesAndroidInjector(modules = [SplashModule::class, ViewModule::class])
    abstract fun bindSplashActivity(): SplashActivity
}

我试图在ToothPick中找到如何做的方法,但是找不到任何正式文档或博客文章!

谢谢?

1 个答案:

答案 0 :(得分:0)

是的,您可以以非常相似的方式进行操作。

您可以有一个将视图接口绑定到InstanceProvider的模块(您可以将其定义为lambda)

在演示者中,您将View声明为@Inject,然后在初始化过程中调用Toothpick.inject()。

唯一棘手的部分是照顾范围树。当我这样做时,我既使用了Application范围,也使用了Activity范围,并且只在Activity级别声明了View的绑定,然后演示者调用具有相同范围的inject,并且一切正常。

需要Activity范围,因此每次创建新的Activity时,我们都会覆盖InstanceProvider(并且View具有新的引用,并且如果范围相同,我还记得旧的缓存)

我希望我能正确解释。怎么做尚不明显,但一旦所有步骤都准备就绪,便很有意义。