web-dev-qa-db-ja.com

Dagger 2:@Providesアノテーション付きメソッドなしでは提供できません

私は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ユーザーからの入力を聞きたいです。

10
hanchen ke

CoffeeMachineにはCoffeeMakerが必要です。また、コンストラクターに@Injectアノテーションを付けることで、DaggerがCoffeeMachineへの依存関係を提供することを宣言しました。しかし、ダガーは言います:

@Providesアノテーション付きメソッドなしでCoffeeMakerを提供することはできません

CoffeeMakerオブジェクトの作成方法をどこにも指定していないためです。 @Injecting 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);
    }

}
11
azizbekian