Dagger2 中缺少绑定?
Binding is missing in Dagger2?
我已经制作了一个简单的应用程序,它在 dagger2 的帮助下告诉汽车是两轮车还是四轮车,但是如果我 运行 该应用程序并且错误是绑定丢失,则会发生错误为此,我也使用了@Named注解,但错误一再出现。
MainActivity.kt
class MainActivity : AppCompatActivity() {
@Inject
lateinit var car: Car
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DaggerCarComp.builder().build().inject(this)
car.tellCarTypes()
}
}
Car.kt
class Car @Inject constructor(
@Named("two") val tw: TW,
val fw: FW
) {
fun tellCarTypes() {
tw.whichCar()
}
}
CarComp.kt
@Component(modules = [CarModule::class])
interface CarComp {
fun inject (mainActivity: MainActivity)
}
CarType.kt
interface CarType {
fun whichCar()
}
class TW @Inject constructor() : CarType {
override fun whichCar() {
Log.d("Type", "whichCar: Two wheeler")
}
}
class FW : CarType {
override fun whichCar() {
Log.d("Type", "whichCar: Four wheeler")
}
}
CarModule.kt
@Module
class CarModule {
@Provides
@Named("two")
fun tellCar(tw: TW) : CarType {
return tw
}
@Provides
@Named("four")
fun tellCar2() : CarType {
return FW()
}
}
Error image
您的 class FW 的构造函数旁边没有 @Inject 注释。我认为必须以这种方式定义它,以便 Dagger 知道该怎么做
class FW @Inject constructor() : CarType {
override fun whichCar() {
Log.d("Type", "whichCar: Four wheeler")
}
}
您的函数 tellCar2
也应该这样定义:
@Provides
@Named("four"
fun tellCar2(fw: FW) : CartType {
return fw
}
既然你使用的是接口,你也可以在抽象模块中使用@Binds,这样你就可以根据你的需要直接绑定接口的正确实现。查看这篇文章:https://medium.com/mobile-app-development-publication/dagger-2-binds-vs-provides-cbf3c10511b5 or this : https://dagger.dev/api/2.21/dagger/Binds.html
我已经制作了一个简单的应用程序,它在 dagger2 的帮助下告诉汽车是两轮车还是四轮车,但是如果我 运行 该应用程序并且错误是绑定丢失,则会发生错误为此,我也使用了@Named注解,但错误一再出现。
MainActivity.kt
class MainActivity : AppCompatActivity() {
@Inject
lateinit var car: Car
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DaggerCarComp.builder().build().inject(this)
car.tellCarTypes()
}
}
Car.kt
class Car @Inject constructor(
@Named("two") val tw: TW,
val fw: FW
) {
fun tellCarTypes() {
tw.whichCar()
}
}
CarComp.kt
@Component(modules = [CarModule::class])
interface CarComp {
fun inject (mainActivity: MainActivity)
}
CarType.kt
interface CarType {
fun whichCar()
}
class TW @Inject constructor() : CarType {
override fun whichCar() {
Log.d("Type", "whichCar: Two wheeler")
}
}
class FW : CarType {
override fun whichCar() {
Log.d("Type", "whichCar: Four wheeler")
}
}
CarModule.kt
@Module
class CarModule {
@Provides
@Named("two")
fun tellCar(tw: TW) : CarType {
return tw
}
@Provides
@Named("four")
fun tellCar2() : CarType {
return FW()
}
}
Error image
您的 class FW 的构造函数旁边没有 @Inject 注释。我认为必须以这种方式定义它,以便 Dagger 知道该怎么做
class FW @Inject constructor() : CarType {
override fun whichCar() {
Log.d("Type", "whichCar: Four wheeler")
}
}
您的函数 tellCar2
也应该这样定义:
@Provides
@Named("four"
fun tellCar2(fw: FW) : CartType {
return fw
}
既然你使用的是接口,你也可以在抽象模块中使用@Binds,这样你就可以根据你的需要直接绑定接口的正确实现。查看这篇文章:https://medium.com/mobile-app-development-publication/dagger-2-binds-vs-provides-cbf3c10511b5 or this : https://dagger.dev/api/2.21/dagger/Binds.html