【问题标题】:Inject @ActivityScoped object into a Fragment将@ActivityScoped 对象注入片段
【发布时间】:2018-03-02 15:19:24
【问题描述】:

如何将@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
}

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

【问题讨论】:

    标签: android dependency-injection kotlin dagger-2


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多