将@ActivityScoped对象注入片段

时间:2018-03-02 15:19:25

标签: android dependency-injection kotlin dagger-2

如何将@ActivityScoped的模块注入片段。

Fragment中我需要的模块看起来像这样(它在活动中注入了很多)

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

要将MainActivity绑定到Activity我正在使用ActivityModule

@Module
abstract class MainActivityModule {

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

能够注入我的MainActivity我使用这个

@Module
abstract class ActivityModule {

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

我有以下匕首组件:

@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
    }
}

使用常规上下文绑定ApplicationModule

@Module
abstract class ApplicationModule {

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

现在我拥有FragmentModule,可以注入片段

@Module
abstract class FragmentModule {

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

如何扩展匕首以便能够将ClipManager注入Fragment1(其本身位于MainActivity)?

1 个答案:

答案 0 :(得分:4)

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

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

@Module
abstract class ActivityModule {

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

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