繁体   English   中英

Dagger 2.10+:在“活动和片段”中向活动上下文注入依赖项

[英]Dagger 2.10+: Inject dependency with activity context in Activities and Fragments

我有一个名为AlertManager的类,该类需要Activity实例才能显示ToastAlertDialog

class AlertManager @Inject constructor(private val activity: Activity) {

    fun showToast(message: String) {
        Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
    }
}

现在,我希望AlertManager作为两个活动HomeActivityProductsActivity依赖项。 目前,我已经为每个Activity创建了模块,例如:

@Module
class HomeActivityModule {
    @Provides
    @ActivityContext
    fun provideAlertManager(activity: HomeActivity) = AlertManager(activity)
}

@Module
class ProductsActivityModule {
    @Provides
    @ActivityContext
    fun provideAlertManager(activity: ProductsActivity) = AlertManager(activity)
}

然后将它们与Dagger绑定在一起

@Module
abstract class ActivityProvider {
    @ContributesAndroidInjector(modules = [HomeActivityModule::class])
    @ActivityContext
    abstract fun bindHomeActivity(): HomeActivity

    @ContributesAndroidInjector(modules = [ProductsActivityModule::class])
    @ActivityContext
    abstract fun bindProductsActivity(): ProductsActivity
}

现在我的问题是:

1)如何避免为每个活动创建模块并拥有可以与所需的任何Activity绑定的公共ActivityModule

2)比方说,我有一个名为片段HomeFragmentHomeActivity ,那我怎么能注入相同AlertManager实例HomeActivity片段里面?

很长一段时间以来,我一直在这里停留,并试图通过互联网找到很多东西,但是我找不到任何可以帮助我实现所需目标的博客或指南。 如果有人能指出正确的方向,我将不胜感激。

1)如何避免为每个活动创建模块并拥有可以与所需的任何活动绑定的公共ActivityModule?

您可以在其中添加常规活动的某种AlertManagerModule

@Provides
fun provideAlertManager(activity: Activity) = AlertManager(activity)

您仍然必须制作单独的活动模块。 您可以进行的一项更改是:

@Module
abstract class HomeActivityModule {
    @Binds
    abstract fun providesActivity(activity: HomeActivity) : Activity
}

然后可以将它们添加到ActivityProvider类中:

@Module
abstract class ActivityProvider {
    @ContributesAndroidInjector(modules = [HomeActivityModule::class, AlertManagerModule::class])
    abstract fun bindHomeActivity(): HomeActivity

    @ContributesAndroidInjector(modules = [ProductsActivityModule::class, AlertManagerModule::class])
    abstract fun bindProductsActivity(): ProductsActivity
}

2)假设我在HomeActivity中有一个名为HomeFragment的片段,那么如何在片段中注入相同的HomeActivity AlertManager实例?

由于您使用的DaggerActivity和最有可能使用DaggerFragment,HomeFragment实例化的片段,只需使用您在HomeActivityModule添加提供的片段@Inject标注可以直接拿到AlertManager:

 @Module
 abstract class HomeActivityModule {

    @Binds
    abstract fun providesActivity(activity: HomeActivity) : Activity

    @FragmentScope
    @ContributesAndroidInjector
    abstract fun providesHomeFragment() : HomeFragment;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM