В настоящее время я пытаюсь интегрировать Dagger 2 в приложение для Android. Моя настройка проекта выглядит следующим образом:
- библиотека
- приложение (зависит от библиотеки)
В моем проекте библиотеки я определил класс, который я позже буду вводить в другие классы, которые ему нужны (действия и обычные классы) в библиотеке, а также проект приложения.
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
Теперь - например, в моих фрагментах или действиях или в обычных классах я бы ввел вышеупомянутый Singleton следующим образом:
public class SomeClass{
@Inject
MyManager myManager;
}
Или так я думал, потому что на практике myManager всегда равен нулю. И, судя по всему, конструктор так и не вызывается, поэтому, наверное, я должен упустить что-то конфигурационное? Или, может быть, я неправильно понял документацию, и он не предназначен для работы таким образом вообще? Цель класса MyManager - быть доступным компонентом, накапливающим компоненты, доступным для всего приложения - вот почему я пошел на @Singleton.
UPDATE
Чтобы избежать путаницы: я упомянул о том, что у меня есть компоненты где-то в комментарии, я думаю - это относится к компонентам в смысле "компонентного дизайна" и не имеет ничего общего с кинжалом. У меня есть код, основанный на кинжале, который указан выше - в моем коде нет ничего другого, связанного с кинжалом.
Когда я начал добавлять @Component, у меня были некоторые проблемы с компилятором, потому что мой кинжал2 не был настроен должным образом - проверьте этот действительно полезный поток о том, как правильно настроить dagger2: qaru.site/info/69355/...
ОБНОВЛЕНИЕ 2
Вот мой обновленный код, основанный на предложениях Дж. Ломбарда - я изменил код следующим образом: оригинальный синглтон находится в проекте библиотеки:
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
Также в проекте библиотеки находится класс начальной загрузки:
@Singleton
@Component
public interface Bootstrap {
void initialize(Activity activity);
}
Затем я использую вышеприведенный класс Bootstrap в своей деятельности (в моем конкретном приложении НЕ в проекте библиотеки! Тем не менее, у меня есть также классы/действия в библиотеке, которые будут обращаться к Bootstrap для ввода MyManager):
public class MyActivity extends Activity{
@Inject
MyManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//DONT DO THIS !!! AS EXPLAINED BY EpicPandaForce
DaggerBootstrap.create().initialize(this);
}
}
Но даже после этой строки:
DaggerBootstrap.create().initialize(this);
экземпляр менеджера по-прежнему остается нулевым, то есть не вводится.
Я только что нашел это: qaru.site/info/229095/...
Что, если я не ошибаюсь, подразумевает, что мне нужно указать каждый отдельный класс в классе Bootstrap, который будет использовать @Inject для ввода данных. К сожалению - это не вариант, поскольку у меня более 40 классов и видов деятельности, для которых я должен был бы это сделать.
Значение моего интерфейса Bootstrap, по-видимому, должно выглядеть примерно так:
@Singleton
@Component
public interface Bootstrap {
void initialize(ActivityA activity);
void initialize(ActivityB activity);
void initialize(ActivityC activity);
void initialize(ActivityD activity);
void initialize(ActivityE activity);
void initialize(ActivityF activity);
//and so on and so forth...
}
Если вышесказанное верно, это не стоит для моего варианта использования. Плюс: Кажется, нет никакой проверки времени компиляции, если я забыл указать один из моих 40 + классов здесь? Это просто не сработает - то есть сбой приложения во время выполнения.