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