Hello Dagger2 вылетает на Android Studio

Я играю с Dagger2, чтобы понять, как это работает. Я только что создал базовый проект "hello dagger2", но он падает

У меня три класса: Хлеб, Мука и Вода. Хлеб зависит от Муки и Воды.

класс Хлеб:

    public class Bread {

    private Water water;
    private Flour flour;

    @Inject
    public Bread (Water water, Flour flour){
        this.water = water;
        this.flour = flour;
    }
}

класс Вода:

public class Water {

    int waterQuantity;

    public Water(int waterQuantity){
    this.waterQuantity = waterQuantity;
    }
}

класс Мука:

    public class Flour {

    private int flourQuantity;

    public Flour(int flourQuantity){
        this.flourQuantity = flourQuantity;
    }
}

Также я реализовал модуль и компонент

Модуль:

@Module
public class BreadModule {

    @Provides @Singleton
    Bread provideBread(Water water, Flour flour){
     return new Bread(water, flour);
    }
}

Компонент:

@Singleton
@Component (modules = {BreadModule.class})
public interface BreadComponent {

    Bread getBread();
}

Ошибка, с которой я сталкиваюсь:

Ошибка: (13, 11) ошибка: com.example.llisas.testingdagger2.model.Water не может быть предоставлен без конструктора @Inject или из метода, аннотированного @Provides. com.example.llisas.testingdagger2.module.BreadModule.provideBread(com.example.llisas.testingdagger2.model.Вода вода, com.example.llisas.testingdagger2.model.Мука мука) [параметр: com.example.llisas.testingdagger2 .model.Вода вода]

Что я делаю неправильно?


person JoCuTo    schedule 26.04.2016    source источник


Ответы (1)


При попытке предоставить Bread Dagger2 нужны объекты типа Water и Flour. Вам нужно добавить в модуль методы @Provide, которые предоставляют Water и Flour.

Например:

@Provides
Water provideWater() {
     return new Water(1); // instead of 1, you can add any other default value
}

Если у вас есть целое число в этом методе, вы также должны предоставить его, как показано ниже:

@Provides @Named("defaultWaterQuantity")
int provideWaterQuantity() {
    return 1;
}

@Provides
Water provideWater(@Named("defaultWaterQuantity") int waterQuantity){
     return new Water(waterQuantity);
}
person AgileNinja    schedule 26.04.2016
comment
Спасибо, оба метода созданы, получают целое число (количество как параметр) и получают другую ошибку. Предоставляет воду Singleton. } - person JoCuTo; 26.04.2016
comment
Ошибка: (13, 11) ошибка: java.lang.Integer не может быть предоставлен без конструктора Inject или из метода с аннотациями Provides. com.example.llisas.testingdagger2.module.BreadModule.provideBread(com.example.llisas.testingdagger2.model.Вода вода, com.example.llisas.testingdagger2.model.Мука мука) [параметр: com.example.llisas.testingdagger2 .model.Вода вода] com.example.llisas.testingdagger2.module.BreadModule.provideWater(целое количество) [параметр: целое количество] - person JoCuTo; 26.04.2016
comment
Пока у ваших методов есть параметры (в данном случае целые числа), вам нужно будет предоставлять их до тех пор, пока метод предоставления не будет иметь параметров. С целыми числами вы должны добавить аннотацию @Name(description), чтобы различать различные типы целых чисел, которые вы предоставляете. - person AgileNinja; 26.04.2016
comment
Мне очень жаль, я не понимаю, что вы имеете в виду. Не могли бы вы добавить кусок кода в качестве примера - person JoCuTo; 26.04.2016
comment
@JeCuRo, пожалуйста, проверьте редактирование и посмотрите, есть ли у вас какие-либо вопросы - person AgileNinja; 26.04.2016