我有一个名为AlertManager
的类,它需要Activity
实例才能显示Toast
和AlertDialog
。
class AlertManager @Inject constructor(private val activity: Activity) {
fun showToast(message: String) {
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
}
}
现在,我希望AlertManager
作为两个活动HomeActivity
和ProductsActivity
的依存关系。目前,我已经为每个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)如何避免为每个活动创建模块并拥有共同的ActivityModule
并可以与所需的Activity
绑定?
2)假设我在HomeFragment
中有一个名为HomeActivity
的片段,那么我该如何注入AlertManager
的相同HomeActivity
实例在碎片里面?
很长一段时间以来,我一直被困在这里,并试图在互联网上找到很多东西,但是我找不到任何可以帮助我实现所需目标的博客或指南。如果有人可以指出正确的方向,我将不胜感激。
答案 0 :(得分:1)
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 中实例化的片段可以直接通过以下方式直接获取AlertManager您在 HomeActivityModule 中添加的片段中的@Inject批注:
@Module
abstract class HomeActivityModule {
@Binds
abstract fun providesActivity(activity: HomeActivity) : Activity
@FragmentScope
@ContributesAndroidInjector
abstract fun providesHomeFragment() : HomeFragment;
}