error: @Component.Builder is missing setters for required modules or components in Dagger 2 instead of having setter method
error: @Component.Builder is missing setters for required modules or components in Dagger 2 instead of having setter method
我是 dagger 2 的新手。我在 kotlin 上制作了一个 CarComponent,我试图在不调用 petroleEngineModule 的情况下用 horsePower 值调用我的 DaggerCarComponent。以下是我的代码:
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 传递 horsePower,而无需在您的 PetrolEngine 构造函数中以相同的方式传递 PetrolEngineModule.And 的实例:
@Inject
public PetrolEngine(@Named("horse_power") int horsePower) {
this.horsePower = horsePower;
}
并且在您的 PetrolEngineModule 中,您可以删除所有内容,只为 PetrolEngine 保留 @Provides。
删除模块 class 中的 @Inject,因为在 @Component.Builder
中传递 horsePower 时 @BindsInstance 在做什么
只是针对未来观众的优化。只需用它替换现有代码即可。现在 Dagger 不会创建 --Provide-- class 来提供 PetrolEngine 的实例。
如有错误请改进代码
@Module
abstract class PetrolEngineModule {
@Binds
abstract fun bindEngine(engine: PetrolEngine): Engine
}
我是 dagger 2 的新手。我在 kotlin 上制作了一个 CarComponent,我试图在不调用 petroleEngineModule 的情况下用 horsePower 值调用我的 DaggerCarComponent。以下是我的代码:
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 传递 horsePower,而无需在您的 PetrolEngine 构造函数中以相同的方式传递 PetrolEngineModule.And 的实例:
@Inject
public PetrolEngine(@Named("horse_power") int horsePower) {
this.horsePower = horsePower;
}
并且在您的 PetrolEngineModule 中,您可以删除所有内容,只为 PetrolEngine 保留 @Provides。
删除模块 class 中的 @Inject,因为在 @Component.Builder
中传递 horsePower 时 @BindsInstance 在做什么只是针对未来观众的优化。只需用它替换现有代码即可。现在 Dagger 不会创建 --Provide-- class 来提供 PetrolEngine 的实例。
如有错误请改进代码
@Module abstract class PetrolEngineModule { @Binds abstract fun bindEngine(engine: PetrolEngine): Engine }