ошибка: @ Component.Builder отсутствует установщики для необходимых модулей или компонентов в Dagger 2 вместо использования метода установки - PullRequest
1 голос
/ 24 января 2020

Я новичок в dagger 2. Я делал CarComponent на kotlin, я пытался вызвать мой DaggerCarComponent со значением horsePower без вызова 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 здесь as 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

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Удалите @Inject в классе модуля, потому что то, что делает @BindsInstance при передаче horsePower в @ Component.Builder

0 голосов
/ 24 марта 2020

Просто оптимизация для будущих зрителей. Просто замените существующий код этим. Теперь Dagger не будет создавать класс --Provide-- для предоставления экземпляра PetrolEngine.

Пожалуйста, улучшите код, если обнаружите, что что-то не так.


    @Module
    abstract class PetrolEngineModule {

        @Binds
        abstract fun bindEngine(engine: PetrolEngine): Engine
    }

0 голосов
/ 24 января 2020

В вашем Builder:

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

После этого вы сможете передавать horsePower из MainActivity, не передавая экземпляр PetrolEngineModule. И точно так же в вашем конструкторе PetrolEngine:

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

А в вашем PetrolEngineModule вы можете удалить все и просто оставить @Provides для PetrolEngine.

...