android - Dagger 2.10+ : Inject dependency with activity context in Activities and Fragments

标签 android dagger-2

我有一个名为 AlertManager 的类,它需要 Activity 实例来显示 ToastAlertDialog

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

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

现在,我希望 AlertManager 作为两个 Activity 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 绑定(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/

相关文章:

java - 为什么我会收到此错误 "cannot resolve method ' getSharedPreferences (Java.lang.String.int)”

android - Jetpack Compose 无法编译应用程序,找不到 kotlin-compiler

android - 如何在自定义 View 或其他 android 类中使用 AndroidInjection 类?

dagger-2 - 使子组件继承不同组件的依赖关系

android - 在屏幕墙上播放和分割视频

java - 如何使带有 List<> 的 kotlin 函数可从 Java 调用

android - Dagger2 中 @Binds 与 @Provides 注释的用例是什么

java - 使用 Dagger 2 在 Fragment 中注入(inject)依赖项时出错

kotlin - 带有 Kotlin 类委托(delegate)的 Dagger 构造函数注入(inject)

android - 连接充电器时在 Android 上自动开机