Кинжал не инициализирует введенное поле в Android

Начал внедрять Dagger в свое приложение, и у меня возникли проблемы с инициализацией очень простого поля. Вот сокращенная версия моего кода:

@Inject public DaggerUtils daggerUtils; 

public class AppState extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Set up Dagger
        AppModule appModule = new AppModule();
        mObjectGraph.create(appModule);

        daggerUtils.print();
    }
}

Используемый модуль:

@Module(
        injects = { AppState.class}
)
public class AppModule {

    // This provides method is commented out because from what I can understand from the Dagger documentation
    // Dagger should automatically take care of calling the constructor I have provided
    // with the @Inject annotation. I have tried commenting this out as well and it still
    // fails.
    //@Provides
    //DaggerUtils provideDaggerUtils() {
    //    return new DaggerUtils();
    //}
}

Базовый класс утилиты:

public class DaggerUtils {

    @Inject
    public DaggerUtils() {

    }

    public void print(){
        Logger.e("Dagger", "printed instantiated");
    }
}

Итак, насколько я понимаю, поскольку у меня есть аннотация @Inject перед конструктором DaggerUtils и аннотация @Inject перед экземпляром DaggerUtils, который я использую в своем классе AppState, Dagger должен позаботиться об инициализации экземпляра DaggerUtils без вызова конструктора. . Однако он продолжает выдавать мне исключение NullPointerException, когда я пытаюсь вызвать daggerUtils.print() (строка 12 в классе AppState). Почему кинжал не инициализирует DaggerUtils? Я чувствую, что мне здесь не хватает чего-то очень простого. Я также пытался использовать метод @Provides, закомментированный в AppModule, для предоставления экземпляра DaggerUtils, но он все еще не работает.


person odiggity    schedule 02.05.2014    source источник


Ответы (1)


У меня была такая же проблема сегодня вечером.

Для каждого класса, которому нужна инъекция, вы должны вызвать:

mObjectGraph.create(appModule).inject(this);

Это полезно для создания метода инъекции в Application.

public void inject(Object object) {
    mObjectGraph.inject(object);
}
person Daggeto    schedule 03.05.2014
comment
Хорошо, это работает. Я все еще немного смущен. В чем разница между вызовом mObjectGraph.create(appModule).inject(this) и наличием injects = {MyClass.class} в модуле? - person odiggity; 20.06.2014
comment
injects = { MyClass.class } похоже на объявление, что appModule будет внедрять этот класс. Если вы вызываете mObjectGraph.create(appModule).inject(this) без этого объявления, возникает исключение - person Daggeto; 01.07.2014