Acabo de empezar a aprender dagger2 y enfrenté un problema extraño que me parece un error. Aquí está el módulo:
@Module public class SimpleModule { @Provides Cooker providerCooker() { return new Cooker("tom", "natie"); } }Componente:
@Component(modules = SimpleModule.class) public interface SimpleComponent { void inject(DaggerTestActivity activity); }Interfaz:
public interface CoffeeMaker { String makeCoffee(); }Implementación:
public class SimpleMaker implements CoffeeMaker { Cooker mCooker; @Inject public SimpleMaker(Cooker cooker) { this.mCooker = cooker; } @Override public String makeCoffee() { return mCooker.makeCoffee(); } }Horno :
public class Cooker { String name; String coffeeKind; public Cooker(String name, String coffeeKind) { this.name = name; this.coffeeKind = coffeeKind; } public String makeCoffee() { return name + "make" + coffeeKind; } }Maquina de cafe:
public class CoffeeMachine { CoffeeMaker mMaker; @Inject public CoffeeMachine(CoffeeMaker coffeeMaker) { this.mMaker = coffeeMaker; } public String makeCoffee() { return mMaker.makeCoffee(); } }Solo esto. Lo uso en la actividad. Se enfrentó a un problema extraño aquí:
@Inject CoffeeMachine mCoffeeMachine;El error que recibo del compilador Dagger 2 es el siguiente:
Error:(14, 10) com.wyyc.daggertest.CoffeeMaker cannot be provided without an @Provides-annotated method. com.wyyc.zqqworkproject.DaggerTestActivity.mCoffeeMachine [injected field of type: com.wyyc.daggertest.CoffeeMachine mCoffeeMachine] com.wyyc.daggertest.CoffeeMachine.<init>(com.wyyc.daggertest.CoffeeMaker coffeeMaker)Toda esta situación parece muy extraña, y me gustaría escuchar algunos aportes de usuarios más experimentados de Dagger 2.
Su CoffeeMachine necesita CoffeeMaker . Y ha declarado que Dagger se encargará de proporcionar esa dependencia a CoffeeMachine al anotar el constructor con @Inject . Pero Daga dice:
CoffeeMaker no se puede proporcionar sin un método anotado por @Provides
Porque no ha especificado en ninguna parte cómo se debe crear el objeto CoffeeMaker . @Inject SimpleMaker no es suficiente, porque SimpleMaker != CoffeeMaker . Por lo tanto, debe especificar explícitamente que cuando Dagger quiera CoffeeMaker , proporcione SimpleMaker .
Cambie su módulo a esto:
@Module public class SimpleModule { @Provides Cooker providerCooker() { return new Cooker("tom", "natie"); } @Provides CoffeeMaker provideCoffeeMaker(Cooker cooker) { return new SimpleMaker(cooker); } }En mi caso, me perdí un módulo en @Component (en la aplicación de varios módulos). Gracias a @azizbekian.
@Component( modules = [ ApiModule::class, SettingsModule::class, CoroutinesModule::class // <- I forgot one of these modules ], dependencies = [Api::class, NetworkProvider::class] ) interface YourComponent {