我有一个名为 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
作为两个 Activity 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 绑定(bind)它们
@Module
abstract class ActivityProvider {
@ContributesAndroidInjector(modules = [HomeActivityModule::class])
@ActivityContext
abstract fun bindHomeActivity(): HomeActivity
@ContributesAndroidInjector(modules = [ProductsActivityModule::class])
@ActivityContext
abstract fun bindProductsActivity(): ProductsActivity
}
现在我的问题是:
1) 我怎样才能避免为每个 Activity 创建模块并拥有可以与我想要的任何 Activity
绑定(bind)的通用 ActivityModule
?
2) 假设我在 HomeActivity
中有一个名为 HomeFragment
的 fragment ,那么我该如何注入(inject)相同的 AlertManagerHomeActivity
的 实例?
我被困在这里很长时间了,并试图在互联网上找到很多东西,但我找不到任何博客或指南可以帮助我实现我正在寻找的东西。如果有人能给我指出正确的方向,我将不胜感激。
最佳答案
1) How can I avoid creating modules for each activities and have common ActivityModule which I can bind with whatever Activity I want?
您可以拥有某种AlertManagerModule,您可以在其中添加通用 Activity 。
@Provides
fun provideAlertManager(activity: Activity) = AlertManager(activity)
您仍然需要制作单独的 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) Let's say I have a fragment called HomeFragment inside HomeActivity, then how can I inject the same AlertManager instance of HomeActivity inside the fragment?
由于您正在使用 DaggerActivity 并且很可能使用 DaggerFragment,因此在 HomeFragment 中实例化的 fragment 可以通过简单地使用直接获取 AlertManager如果您在 HomeActivityModule 中添加 fragment 中的 @Inject 注释:
@Module
abstract class HomeActivityModule {
@Binds
abstract fun providesActivity(activity: HomeActivity) : Activity
@FragmentScope
@ContributesAndroidInjector
abstract fun providesHomeFragment() : HomeFragment;
}
关于android - Dagger 2.10+ : Inject dependency with activity context in Activities and Fragments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55808275/