android - 无法从 Dagger(Android)中的 Fragment 组件访问 Activity 组件
问题描述
我正在尝试为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-annotated 方法,就无法提供活动。
我的理解是,既然Activity
已经被注入了ActivityComponent
, 并且Fragment
只是将自己添加到 中ActivityComponent
,它应该得到ActivityComponent
andAppComponent
的模块提供的所有依赖项。我看到这种情况发生在ActivityComponent
,我从那里AppComponent
自动获取依赖项。
更新:如果我将以下代码添加到FragmentModule
,我可以编译代码:
@Provides
fun provideActivity() = fragment.context as Activity
但这对我来说没有意义,因为我希望Activity
从ActivityComponent
解决方案
我意识到父组件应该始终声明它们想要公开的依赖项。否则,依赖组件不能仅通过将它们声明为依赖项来访问它们。请注意,传递依赖也不起作用。因此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
}
推荐阅读
- git - 使用 ALLOW_DEBUGGER=1 git commit 绕过这个检查
- amazon-web-services - 无法从亚马逊复制简单的哈希签名示例
- sql - 根据用户选择获取当前日期、当前月份、当前年份 - SQL 存储过程
- python - BeautifulSoup 抓取多个链接
- python - 无法使用 matplotlib 在我的图形的 python 代码中放置最大值和最小值
- machine-learning - 如何计算多类多标签分类的 f1_score
- bash - Mac OS Mac Ports 删除了 bash(没有可用的命令行)
- swiftui - SwiftUI:如何呈现所有视图的视图?(尤其是床单)
- typescript - 打字稿无限递归推理
- swift - 如何遍历 Firestore 数据库以找到第一个值!= nil?