【问题标题】:error: @Component.Builder is missing setters for required modules or components in Dagger 2 instead of having setter method错误:@Component.Builder 在 Dagger 2 中缺少所需模块或组件的设置器,而不是设置器方法
【发布时间】:2020-01-24 08:05:28
【问题描述】:

我是 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

【问题讨论】:

  • 你构建时它会抛出任何异常
  • 没有例外,这是我现在遇到的错误:错误:@Component.Builder 缺少所需模块或组件的设置器:[com.example.daggerapp.PetrolEngineModule]
  • 嗨,@SuvodipMondal 欢迎来到 SO 社区。您能否在初始化 DaggerComponent 的位置添加代码。

标签: android android-studio kotlin dagger-2 dagger


【解决方案1】:

在您的构建器中:

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

在此之后,您将能够从 MainActivity 传递马力,而无需传递 PetrolEngineModule 的实例。在您的 PetrolEngine 构造函数中也是如此:

@Inject
public PetrolEngine(@Named("horse_power") int horsePower) {
    this.horsePower = horsePower;
}

在您的 PetrolEngineModule 中,您可以删除所有内容并留下 @Provides for PetrolEngine。

【讨论】:

  • 不,我想省略 PetrolEngineModule 的显式初始化
  • 我不知道这是怎么回事。我仍然收到错误,ohttps://github.com/smondal229/daggerAndroid.git 这是我的存储库链接
  • 顺便说一句,请从您的 PetrolEngineModule 中删除 provideHorsePower 和构造函数。不再需要,因为您已经通过了 horsePower
  • 我还是要明确提到模块,@Component.builder setter 方法没有正确绑定,如果你检查 repo 你会发现它
  • 因为你的 PetrolEngineModule 中仍然有构造函数。在我之前的评论中,我告诉你从你的 PetrolEngineModule 中删除 provideHorsePower 和构造函数
【解决方案2】:

删除模块类中的@Inject,导致@BindsInstance在@Component.Builder中传递马力时正在做什么

【讨论】:

  • 无论哪种方式,我的说法都是正确的,您不应该使用 @Inject 注释模块,并且请在您寻求帮助时及时做出回应
【解决方案3】:

只是对未来观众的优化。只需用此替换现有代码即可。现在 Dagger 不会创建 --Provide-- 类来提供 PetrolEngine 的实例。

如果发现有问题,请改进代码。

@模块 抽象类 PetrolEngineModule { @Binds 抽象乐趣 bindEngine(engine: PetrolEngine): Engine }

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2017-10-20
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多