android - 错误 : @Component. Builder 缺少 Dagger 2 中所需模块或组件的 setter ,而不是 setter 方法

标签 android android-studio kotlin dagger-2 dagger

我是 dagger 2 的新手。我在 kotlin 上制作了一个 CarComponent,我试图用 horsePower 值调用我的 DaggerCarComponent,而不调用 PetrolEngineModule。以下是我的代码:

import dagger.BindsInstance
import dagger.Component
import javax.inject.Singleton

@Component (
    modules = [WheelModule::class, PetrolEngineModule::class]
)
interface CarComponent {

    fun getCar(): Car

    fun inject(mainActivity: MainActivity)

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun horsePower(horsePower : Int) : Builder

        fun build(): CarComponent
    }
}

这是 PetrolEngine.kt:
package com.example.daggerapp

import android.util.Log
import javax.inject.Inject

class PetrolEngine : Engine {

    private var horsePower : Int

    @Inject constructor(horsePower: Int){
        this.horsePower = horsePower
    }

    override fun start() {
        Log.d("Engine", "Broom..., horsePower: ${this.horsePower}")
    }
}

这是 PetrolEngineModule.kt:
package com.example.daggerapp

import dagger.Module
import dagger.Provides
import javax.inject.Inject

@Module
class PetrolEngineModule {

    private var horsePower: Int

    @Inject constructor(horsePower: Int) {
        this.horsePower = horsePower
    }

    @Provides
    fun provideHorsePower(): Int {
        return horsePower
    }

    @Provides
    fun provideEngine(engine: PetrolEngine): Engine
    {
        return engine
    }
}

我在这里添加了 DaggerComponent 作为 DaggerCarComponent :
package com.example.daggerapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import javax.inject.Inject

class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var car:Car

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val daggerCar: CarComponent = DaggerCarComponent.builder().petrolEngineModule(PetrolEngineModule(140)).build()
        daggerCar.inject(this)

        Log.d("Car instance", "$car")
        car.drive()
    }
}


我正在关注本教程:https://www.youtube.com/watch?v=3tIvekCTSJg&list=PLrnPJCHvNZuA2ioi4soDZKz8euUQnJW65&index=8

最佳答案

在您的构建器中:

@BindsInstance
    Builder horsePower(@Named("horse_power") int horsePower);

在此之后,您将能够从 MainActivity 传递马力,而无需传递 PetrolEngineModule 的实例。在您的 PetrolEngine 构造函数中以同样的方式:
@Inject
public PetrolEngine(@Named("horse_power") int horsePower) {
    this.horsePower = horsePower;
}

在您的 PetrolEngineModule 中,您可以删除所有内容,然后将 @Provides 留给 PetrolEngine。

关于android - 错误 : @Component. Builder 缺少 Dagger 2 中所需模块或组件的 setter ,而不是 setter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59892528/

相关文章:

Java:两个具有相同速度的背景相互重叠

android - 在 Android 中使用 tab-host 实现选项卡之间的滑动

Java Low Level API 应用程序引擎 Android 等效项

java - 如何在Android Studio上设置webdav?

android - 如何在 Android Studio 2.2 中手动选择目标设备?

java - AVD 管理器无法加载已安装的系统镜像

android - 这里的 "authority"是什么意思?

list - 使用 Kotlin 将字符串列表中的每个元素设为小写

java - 错误 "Required:String Found:String?"Kotlin 和 Android Studio

java - 模块错误 "Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16"