【发布时间】:2022-01-17 06:15:06
【问题描述】:
我正在尝试使用 Dagger 子组件,但遇到了一个我难以理解的错误。
所以基本上我有一个Subcomponent 和一个Component。
// FeatureComponent.kt, @Subcomponent
@Scope
annotation class Feature
@Subcomponent(modules = [FeatureModule::class])
@Feature
interface FeatureComponent {
fun inject(loginActivity: LoginActivity)
@Subcomponent.Builder
interface Builder {
fun build(): FeatureComponent
}
}
@Module
class FeatureModule {
@Provides
@Feature
fun provideFeatureStorage(): FeatureStorage {
return FeatureStorage()
}
}
@Feature
class FeatureStorage
还有Component:
@Component(modules = [LoginModule::class])
@Singleton
interface LoginComponent {
fun loginComponent(): LoginComponent
fun inject(loginActivity: LoginActivity)
@Component.Builder
interface Builder {
fun build(): LoginComponent
}
fun featureComponent(): FeatureComponent.Builder // declare the subcomponent
}
@Module(subcomponents = [FeatureComponent::class])
class LoginModule {
@Provides
@Singleton
fun provideSingletonInstance(): Storage {
return Storage()
}
@Provides
fun provideNotSingletonInstance(): UserSession {
return UserSession()
}
}
class Storage
class UserSession
我正在尝试在这样的活动中注入@Subcomponent 提供的FeatureStorage:
class LoginActivity : AppCompatActivity() {
@Inject
lateinit var featureStorage: FeatureStorage
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
loginComponent.inject(this)
loginComponent.featureComponent().build().inject(this)
}
}
但是 Dagger 编译失败:
[Dagger/MissingBinding] com.vgrec.daggerkurs.components.FeatureStorage 如果没有 @Inject 构造函数或 @Provides-annotated 方法。
组件中存在具有匹配键的绑定: com.vgrec.daggerkurs.components.FeatureComponent com.vgrec.daggerkurs.components.FeatureStorage 被注入 com.vgrec.daggerkurs.components.LoginActivity.featureStorage com.vgrec.daggerkurs.components.LoginActivity 注入于 com.vgrec.daggerkurs.components.LoginComponent.inject(com.vgrec.daggerkurs.components.LoginActivity)
这部分:FeatureStorage cannot be provided without an @Inject constructor or an @Provides-annotated method 看起来很奇怪,因为FeatureStorage 是使用@Provides 注释提供的。
有什么想法可能在我的设置中出错吗?
【问题讨论】: