Инъекция поля не работает в Android dagger2 - PullRequest
0 голосов
/ 12 июня 2019

Я пробую свои руки на кинжале. До сих пор я понял, что нужно внедрить зависимость в один класс, нам нужно сначала кинжать, как эта зависимость создается с помощью внедрения модулей или конструктора. Затем использовать эту зависимость с помощью методов Components.

Вот пример кода, который я пытаюсь
Класс войны зависит от Дома1 и Дома2

Военный класс

public class War {

    @Inject House1 house1;
    @Inject House2 house2;

    public void startWar(){
        house1.prepareForWar();
        house1.reportForWar();

        house2.prepareForWar();
        house2.reportForWar();

        System.out.println("House1 is "+house1);
    }
}

Дом1 Класс

public class House1 implements House {

    @Inject
    public House1() {
    }

    @Override
    public void prepareForWar() {
        System.out.println("House1 Prepared for War");
    }

    @Override
    public void reportForWar() {
        System.out.println("House1 reported for War");
    }
}

Дом2 Класс

public class House2 implements House {

    @Inject
    public House2() {
    }

    @Override
    public void prepareForWar() {
        System.out.println("House2 prepared for war");
    }

    @Override
    public void reportForWar() {
        System.out.println("House2 reported for War");
    }
}

Класс WarModule

@Module
public class WarModule {

    @Provides
    public War provideWarObject(){
        return new War();
    }
}

Класс компонентов

@Component(modules = {WarModule.class})
public interface HouseComponent {
    War getWar();
}

Основной класс

public class TempMain {

    public War war;

    public void startWar(){
        war = DaggerHouseComponent.builder().warModule(new WarModule()).build().getWar();
        war.startWar();
    }
}

Здесь Кинжал знает, как House1 и House2 создаются с помощью Constructor и War Object через WarModule.

Так что в военном классе, когда используются @Inject House1 и @Inject House2, кинжал должен внедрить его, поскольку он знает, как создавать эти зависимости. Но я получаю исключение Null Pointer здесь

Ошибка: Исключение в потоке "main" java.lang.NullPointerException на com.gosemathraj.dagger2.java.models.war.War.startWar (War.java:14)

1 Ответ

1 голос
/ 12 июня 2019

Итак, в классе войны, когда используются @Inject House1 и @Inject House2, кинжал должен внедрить его, поскольку он знает, как создавать эти зависимости.Но здесь я получаю исключение Null Pointer Exception

Кинжал ничего не сделает, потому что you создает объект здесь:

@Provides
public War provideWarObject(){
    return new War();
}

Если вы используете @Предоставляет аннотированный метод, необходимый для настройки объекта перед его возвратом.Кинжал будет внедрять только те объекты, которые он создает или в которые вы вызываете component.inject(object).

Самое простое решение - удалить аннотированный метод @Provides и добавить @Inject public War() {} в ваш класс.Затем Dagger может создать объект и затем внедрить его, то же самое, что вы уже делаете для своих House* классов.

На дополнительном замечании, я не знаю, почему вы использовали бы инъекцию поля поверхВнедрение в конструктор, но вы также можете перенести свои зависимости в конструктор, оставив поля закрытыми.

...