android - 将 @ActivityScoped 对象注入(inject)到 Fragment 中

标签 android dependency-injection kotlin dagger-2

如何将 @ActivityScoped 模块注入(inject) fragment 中。

我在 fragment 中需要的模块看起来像这样(它很好地注入(inject)到 Activity 中)

@ActivityScoped
class ClipManager @Inject constructor(private val activity: Activity) { ... }

要将我的 MainActivity 绑定(bind)到 Activity,我正在使用 ActivityModule

@Module
abstract class MainActivityModule {

    @Binds
    @ActivityScoped
    internal abstract fun bindActivity(mainActivity: MainActivity): Activity
}

为了能够注入(inject)我的MainActivity,我使用这个

@Module
abstract class ActivityModule {

    @ActivityScoped
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    internal abstract fun mainActivity(): MainActivity
}

我有以下 Dagger 组件:

@Singleton
@Component(modules = [
    ApplicationModule::class,
    AndroidSupportInjectionModule::class,
    ActivityModule::class,
    FragmentModule::class])
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): AppComponent.Builder

        fun build(): AppComponent
    }
}

使用常规上下文绑定(bind)ApplicationModule

@Module
abstract class ApplicationModule {

    @Binds
    @Singleton
    internal abstract fun bindContext(application: Application): Context
}

现在我有了FragmentModule,它可以注入(inject)到 fragment 中

@Module
abstract class FragmentModule {

    @FragmentScoped
    @ContributesAndroidInjector
    internal abstract fun fragment1(): Fragment1
}

如何扩展 dagger 以便能够将 ClipManager 注入(inject)到 Fragment1 (它本身位于 MainActivity 中) ?

最佳答案

您需要使 FragmentComponent 成为 ActivityComponent 的子组件。这样做将允许 fragment 注入(inject)其父组件中绑定(bind)的任何内容。

您真正需要做的就是从 AppComponent 上的模块列表中删除 FragmentModule::class 并将其添加到您的 ActivityComponent 中:

@Module
abstract class ActivityModule {

  @ActivityScoped
  @ContributesAndroidInjector(modules = [MainActivityModule::class, FragmentModule::class])
  internal abstract fun mainActivity(): MainActivity
}

这样它将成为 MainActivityComponent 的子组件。

关于android - 将 @ActivityScoped 对象注入(inject)到 Fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072077/

相关文章:

c# - 长度为 2 的多个构造函数。无法与 Unity 消除歧义

Angular:如何解决指令和组件之间的循环依赖?

java - 将电子邮件发件人 bean Autowiring 到另一个 bean 中?

Kotlin "Any type that implements an interface"

generics - 让非泛型类在构造函数中采用泛型参数

java - 在不同语言支持下将文本转换为语音的一种巧妙方法

java - 使用 Otto 时订户不会被解雇

java - 如何使用 android 在 SQLite 中添加更多列

gradle - Gradle无法解析 'kotlin'插件。我是否缺少正确的Maven存储库?

Android 自动完成匹配选项