私は 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 ユーザーからの意見を聞きたいです。
ベストアンサー1
がCoffeeMachine
必要です。そして、コンストラクターに の注釈を付けることで、CoffeeMaker
Dagger が への依存関係を提供することを宣言しました。しかし、Dagger は次のように言います:CoffeeMachine
@Inject
CoffeeMakerは@Providesアノテーション付きメソッドなしでは提供できません
CoffeeMaker
オブジェクトをどのように作成するかをどこにも指定していないためです。 !=なので、@Inject
だけではSimpleMaker
不十分です。したがって、Dagger が を必要とするときに を提供することを明示的に指定する必要があります。SimpleMaker
CoffeeMaker
CoffeeMaker
SimpleMaker
モジュールを次のように変更します。
@Module
public class SimpleModule {
@Provides
Cooker providerCooker() {
return new Cooker("tom", "natie");
}
@Provides
CoffeeMaker provideCoffeeMaker(Cooker cooker) {
return new SimpleMaker(cooker);
}
}