Модуль Dagger2: как получить контекст для передачи конструктору класса, который я хочу предоставить

Первый раз использую Dagger2.

В моем приложении для Android у меня есть класс MyApplication, который расширяет Application. У меня также есть класс ImageAssistant, представляющий собой набор связанных методов обработки изображений. В моем классе MyApplicaiton я создавал экземпляр ImageAssistant для всех используемых действий.

Теперь я пытаюсь заставить его работать с Dagger2, но я не знаю, как передать контекст в модуль, который предоставляет ImageAssistant

Вот как выглядел мой код:

public class ImageAssistant {

    Context context;

    public ImageAssistant(Context context){
        this.context = context;
    }


    // A bunch of methods...

}

public class MyApplication extends Application {

    public ImageAssistant imageAssistant;

    public void onCreate() {

        imageAssistant = new ImageAssistant(this);
    }

}

Теперь введите Dagger 2, вот что у меня есть

public class ImageAssistant {

    Context context;

    @Inject
    public ImageAssistant(Context context){
        this.context = context;
    }


    // A bunch of methods...

}

public class MyApplication extends Application {

    @Inject
    public ImageAssistant imageAssistant;

    public void onCreate() {


    }

}

в пакете .modules:

AppModule.java


@Module
public class AppModule {

    @Provides
    ImageAssistant provideImageAssistant() {
        return new ImageAssistant(); // HERE A CONTEXT IS NEEDED. WHERE TO GET IT FROM?
    }

}

РЕДАКТИРОВАТЬ: Вот как сейчас выглядит мой модуль, но я до сих пор не знаю, как связать все вместе:

@Module
public class AppModule {

    private MyApplication application;

    public AppModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    Context provideApplicationContext() {
        return this.application;
    }

    @Provides
    ImageAssistant provideImageAssistant(ImageAssistant imageAssistant) {
        return imageAssistant;
    }

}

А это AppComponent:

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {

    ImageAssistant provideImageAssistant();
    Context context();

}

person Kaloyan Roussev    schedule 03.06.2015    source источник


Ответы (2)


Ваш модуль должен выглядеть так:

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

    private MyApplication application;

    public AppModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    public ImageAssistant provideImageAssistant() {
        return new ImageAssistantImpl(application); // implementation of ImageAssistant
    }

}

Использование в Activity:

public class MainActivity extends Activity{

@Inject
ImageAssistant imageAssistant;

@Override
protected void onCreate(Bundle savedInstanceState) {
    SharedObjectGraph.inject(this);
    imageAssistant.doSomething();
}

}

Не забудьте инициализировать класс ObjectGraph в Application. Я использую статический класс SharedObjectGraph для совместного использования ObjectGraph, созданного из AppModule, во всем приложении.

Прочтите раздел построение графика.

person klimat    schedule 03.06.2015
comment
и как мне использовать помощника по изображениям из активности? - person Kaloyan Roussev; 03.06.2015
comment
Вы предоставили ссылку на Square Dagger, строящий график, я использую Dagger 2. Это то же самое? - person Kaloyan Roussev; 03.06.2015
comment
Dagger2 не является форком Square's Dagger. Я использую Square's Dagger, и приведенные выше фрагменты кода посвящены этому. Но это также должно работать в Dagger2, потому что это главное. - person klimat; 03.06.2015

Я сделал что-то вроде этого:

@Module
public class ApplicationModule {

    private final SpendApplication app;

    public ApplicationModule(SpendApplication app) {
        this.app = app;
    }

    @Provides
    @Singleton
    public Context providesContext() {
        return app;
    }

}

и:

@Module
public class GattManagerModule {

    @Provides
    @Singleton
    GattManager providesGattManager(Context context) {
        return new GattManager(context);
    }
}

И объявите все места, где он используется:

@Component(modules = { ApplicationModule.class, GattManagerModule.class, ...})
@Singleton
public interface ApplicationComponent {
    void inject(MainScreenActivity activity);
    ...
}

В моем классе приложения:

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

    component = DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();

}

И в моей MainActivity:

@Inject
GattManager gattManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getAppComponent().inject(this);
}
person nilsi    schedule 17.04.2017
comment
Я пробовал то же самое, но не работает. GattManager (в моем случае ApiClient) выдает исключение nullpointer - person channae; 17.02.2019
comment
Хорошо, дайте мне знать, если в моем ответе что-то не так, и я обновлю его. Или не стесняйтесь делать это самостоятельно, если у вас достаточно репутации. - person nilsi; 18.02.2019