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