Почему моя подзависимость не устанавливается в Dagger?

Мне трудно понять, как ввести CachedRithms в мой RithmioManager и CachedKamms в мой KamilManager?

У меня есть следующие файлы:

AppScopeModule:

@Module
        (
                library = true,
                complete = false,
                injects = {
                        KamilApplication.class,
                        KamilManager.class
                }
        )
public class AppScopeModule {

    /* package */ static Context sApplicationContext = null;
    private final Context mApplicationContext;

    AppScopeModule(Context applicationContext) {
        KamilManager.initInstance(applicationContext);
        mApplicationContext = applicationContext;
    }

    @Provides
    @Singleton
    KamilManager provideKamilManager() {
        return KamilManager.getInstance();
    }

}

КамилПриложение:

public class KamilApplication extends Application implements Injector {

    private ObjectGraph mObjectGraph;

    @Inject
    KamilManager KamilManager;

    @Override
    public void onCreate() {
        super.onCreate();

        AppScopeModule sharedAppModule = new AppScopeModule(this);

        // bootstrap. So that it allows no-arg constructor in AppScopeModule
        sharedAppModule.sApplicationContext = this.getApplicationContext();

        List<Object> modules = new ArrayList<Object>();
        modules.add(sharedAppModule);
        modules.add(new AuthModule());
        modules.addAll(getAppModules());

        mObjectGraph = ObjectGraph.create(modules.toArray());
        mObjectGraph.inject(this);
    }
}   

КамилМенеджер

public class KamilManager {

    @Inject
    CachedKamms mCachedKamms;

    private static KamilManager instance;
    private boolean mWearIsConnectedToMobile;

    private KamilManager() {
        Log.d(TAG, "KamilManager private constructor");
    }

    public static void initInstance(Context appContext) {
        if (instance == null) {
            instance = new KamilManager();
            .....doing more things here...
        }
    }

    public static KamilManager getInstance() {
        return instance;
    }   
}

Но mCAchedKamms всегда пусто, когда я инициализирую приложение. Любая идея, что я делаю неправильно?


person Kamilski81    schedule 10.01.2015    source источник
comment
Просто примечание: private void KamilManager() не является конструктором.   -  person nhaarman    schedule 10.01.2015


Ответы (1)


Вам нужно позвонить ObjectGraph.inject(this) где-то в KamilManager.

Я предлагаю вам добавить этот код в ваш класс KamilApplication:

public ObjectGraph getObjectGraph() {
    return mObjectGraph;
}

После этого вам нужно каким-то образом получить экземпляр KamilApplication (может быть, передать его через конструктор?) в KamilManager и вызвать:

kamilApplication.getObjectGraph.inject(this);

после этого вызова каждое поле в классе KamilManager, аннотированное @Inject, должно быть введено.

OR

Просто аннотируйте конструктор CachedKamms с помощью @Inject

Дополнительный:

Избегайте использования library = true и complete = false, если вы не знаете, что делаете. С помощью этих настроек вы отключите некоторые проверки во время компиляции.

person WojciechKo    schedule 10.01.2015
comment
Это здорово, спасибо. Это решило проблему. Вам нужно делать .inject() для каждого отдельного класса, который вы хотите внедрить? Я спрашиваю, потому что у меня есть класс с тремя уровнями глубины, где я хочу @Inject поля, но я не уверен, как это сделать? Должен ли я создать еще один вопрос SO для этого? - person Kamilski81; 10.01.2015
comment
Вы можете использовать ObjectGraph.get() для получения экземпляра объекта без вызова ObjectGraph.inject() внутри этого объекта. Вы также можете ознакомиться с примерами на сайте Dagger, это действительно полезно. - person WojciechKo; 12.01.2015