我正在尝试为Activity
和Fragment
创建从属组件。这是我的活动组件:
@Component(modules = [ActivityModule::class],
dependencies = [AppComponent::class])
interface ActivityComponent{
fun inject(activity: Activity)
@Component.Builder
interface Builder{
fun appComponent(component: AppComponent): Builder
fun activityModule(activityModule: ActivityModule): Builder
fun build(): ActivityComponent
}
}
@Module
class ActivityModule(private val activity: Activity) {
@Provides
fun provideActivity() = activity
}
片段组件:
@Component(modules = [FragmentModule::class],
dependencies = [ActivityComponent::class])
interface FragmentComponent{
fun inject(fragment: Fragment)
@Component.Builder
interface Builder{
fun activityComponent(activityComponent: ActivityComponent): Builder
fun fragmentModule(fragmentModule: fragmentModule): Builder
fun build(): FragmentComponent
}
}
@Module
class FragmentModule(private val fragment: Fragment) {
@Provides
fun provideFragment() = fragment
}
在我尝试访问活动的地方出现编译错误。
没有@Provides注释的方法就无法提供活动。
据我了解,由于Activity
已被注入ActivityComponent
中,并且Fragment
只是将自身添加到ActivityComponent
中,因此它应该获取所有提供的依赖项由ActivityComponent
和AppComponent
的模块组成。我在ActivityComponent
中看到了这种情况,在那里我自动从AppComponent
获取依赖项。
更新:
如果将以下代码添加到FragmentModule
,则可以编译该代码:
@Provides
fun provideActivity() = fragment.context as Activity
但这对我来说没有意义,因为我希望从Activity
中获得预先注入的ActivityComponent
答案 0 :(得分:0)
我意识到父组件应该始终声明它们要公开的依赖项。否则,依赖组件不能仅通过将它们声明为依赖项来访问它们。请注意,传递依赖项也不起作用。因此AppComponent
必须声明一个依赖关系,ActivityComponent
才能使用它-但是ActivityComponent
必须重新声明相同的依赖关系,如果FragmentComponent
需要它。
interface ActivityComponent{
fun inject(activity: Activity)
@Component.Builder
interface Builder{
fun appComponent(component: AppComponent): Builder
fun activityModule(activityModule: ActivityModule): Builder
fun build(): ActivityComponent
}
var activity: Activity
}