如何将@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
)?
答案 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的子组件。