私はdagger2の学習を始めたばかりで、バグのように見える奇妙な問題に直面しました。モジュールは次のとおりです。
@Module
public class SimpleModule {
@Provides
Cooker providerCooker() {
return new Cooker("tom", "natie");
}
}
成分:
@Component(modules = SimpleModule.class)
public interface SimpleComponent {
void inject(DaggerTestActivity activity);
}
インターフェース:
public interface CoffeeMaker {
String makeCoffee();
}
実装:
public class SimpleMaker implements CoffeeMaker {
Cooker mCooker;
@Inject
public SimpleMaker(Cooker cooker) {
this.mCooker = cooker;
}
@Override
public String makeCoffee() {
return mCooker.makeCoffee();
}
}
炊飯器:
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;
}
}
コーヒーメーカー:
public class CoffeeMachine {
CoffeeMaker mMaker;
@Inject
public CoffeeMachine(CoffeeMaker coffeeMaker) {
this.mMaker = coffeeMaker;
}
public String makeCoffee() {
return mMaker.makeCoffee();
}
}
それだけ。私は活動で使用しています。ここで奇妙な問題に直面しました:
@Inject
CoffeeMachine mCoffeeMachine;
Dagger 2コンパイラからのエラーは次のとおりです。
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)
この状況はすべて非常に奇妙に見えるので、より経験のあるDagger 2ユーザーからの入力を聞きたいです。
CoffeeMachine
にはCoffeeMaker
が必要です。また、コンストラクターに@Inject
アノテーションを付けることで、DaggerがCoffeeMachine
への依存関係を提供することを宣言しました。しかし、ダガーは言います:
@Providesアノテーション付きメソッドなしでCoffeeMakerを提供することはできません
CoffeeMaker
オブジェクトの作成方法をどこにも指定していないためです。 @Inject
ing SimpleMaker
では十分ではありません。SimpleMaker
!= CoffeeMaker
であるためです。したがって、DaggerがCoffeeMaker
を必要とするときにSimpleMaker
を提供するように明示的に指定する必要があります。
モジュールを次のように変更します。
@Module
public class SimpleModule {
@Provides
Cooker providerCooker() {
return new Cooker("tom", "natie");
}
@Provides
CoffeeMaker provideCoffeeMaker(Cooker cooker) {
return new SimpleMaker(cooker);
}
}