@akardapolov
Java & Oracle

Как заставить работать @Inject в поля класса в Dagger 2?

Не работает внедрение зависимости в поля класса в Dagger 2.11.

Запуск кода:

public class MainWindow {
    @Inject ProfileJPanel profileJPanel;

    @Inject
    public MainWindow(){
        System.out.println(profileJPanel.getName());
    }
}


Приводит к NPE:

Exception in thread "main" java.lang.NullPointerException
at MainWindow.(MainWindow.java:8)
at MainWindow_Factory.get(MainWindow_Factory.java:20)
at MainWindow_Factory.get(MainWindow_Factory.java:6)
at DaggerMainComponent.createMainWindow(DaggerMainComponent.java:44)
at Main.main(Main.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)


Тест кейс доступен по ссылке:

https://github.com/akardapolov/sample_dagger2
  • Вопрос задан
  • 561 просмотр
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Инжект конструктора и инжект полей отличаются. Инжект конструктора работает так - вы перечисляете параметры и они инжектятся. То есть так:
public class MainWindow {
    private final ProfileJPanel profileJPanel;

    @Inject
    public MainWindow(ProfileJPanel profileJPanel){
        this.profileJPanel = profileJPanel;
        System.out.println(profileJPanel.getName());
    }
}


А для инжекта полей нужно вызывать метод inject вашего комонента для конкретного объекта.
Не советую смешивать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@akardapolov Автор вопроса
Java & Oracle
>> Не советую смешивать.

Это потому что внедрение зависимостей для класса происходит в два этапа - сначала в конструкторе, потом через вызов inject? Или есть какие-то еще соображения?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы