【发布时间】:2021-06-17 14:09:10
【问题描述】:
假设我有两个接口和两个实现它们的类。
interface ITest1 {
fun doSomething()
}
interface ITest2 {
fun doSomethingElse()
}
class Test1 @Inject constructor(): ITest1 {
override fun doSomething() {
println("Something")
}
}
class Test2 @Inject constructor(): ITest2 {
@Inject
lateinit var test1: ITest1
override fun doSomethingElse() {
test1.doSomething()
println("Something else ")
}
}
如果我使用@Bind,我可以完成这项工作:
@Module
@InstallIn(SingletonComponent::class)
internal abstract class DependenciesBindings {
@Singleton
@Binds
abstract fun bindTest1(test1: Test1): ITest1
@Singleton
@Binds
abstract fun bindTest2(test2: Test2): ITest2
}
但我想在注入类之前对其进行一些配置。为此,我尝试使用@Provide:
@Module(includes = [DependenciesBindings::class])
@InstallIn(SingletonComponent::class)
object Dependencies {
@Singleton
@Provides
fun provideTest1(): Test1 {
return Test1()
}
@Singleton
@Provides
fun provideTest2(): Test2 {
return Test2()
}
}
@Module
@InstallIn(SingletonComponent::class)
internal abstract class DependenciesBindings {
@Singleton
@Binds
abstract fun bindTest1(test1: Test1): ITest1
@Singleton
@Binds
abstract fun bindTest2(test2: Test2): ITest2
}
但这会使应用程序崩溃:
引起:kotlin.UninitializedPropertyAccessException:lateinit 属性 test1 尚未初始化 在 Test2.getTest1(Test2.kt:8) 在 Test2.doSomethingElse(Test2.kt:11)
为什么会这样?
我希望 ITest1 在提供 Test1 时被正确注入,然后绑定到 ITest1 接口。
是否有解决方法来完成这项工作?
【问题讨论】:
标签: android dagger-2 dagger dagger-hilt