2015-06-03 2 views
1

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

В моем приложении для Android у меня есть класс MyApplication, который расширяет приложение. У меня также есть класс 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? 
    } 

} 

EDIT: Это как мой модуль выглядит, но я до сих пор не знаю, как связать все вместе:

@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(); 

} 

ответ

1

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

@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 по всему приложению.

Прочитано building the graph раздел.

+0

спасибо, я попробую это! –

+0

и как использовать ассистент изображения из активности? –

+0

@ J.K Я отредактировал мой ответ :) – mklimek

1

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

@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); 
} 
Смежные вопросы