2017-02-16 26 views
0

Здравствуйте, я новичок в Dagger2. Цель. Возьмите мой сетевой DI и MVP DI. MVP, как в презентаторе для активности, которая расширяет базовую активность. Я хочу объединить все это в один супермодуль и поместить его в свою базовую деятельность. Со временем добавьте больше докладчиков.Кинжал 2 Как создать модуль для компонентов базовой активности и отдельный модуль для всех компонентов MVP

Я не хочу, чтобы 30+ вводили заявления в мою базу. Я следую this example, но это слишком просто по сравнению с тем, что я пытаюсь сделать.

Я думаю, что проблема связана с инъекцией API при базовом действии. По какой-то причине Кинжал ищет Api в моем классе MVP. Так что это будет вопрос граф зависимости?

Проведя больше времени на этом. Проблема связана с интерфейсом Mvp baseActivity или любым вспомогательным действием, которое расширяет baseActivity. Это означает, что когда он идет на инъекцию, он видит вызов @inject Api и не может его найти. Он будет работать, если я добавлю Api в этот модуль, но это вверх дном, что я хочу. Я хочу Компонент/Модуль для элементов уровня приложения. Затем я хочу, чтобы компонент/модуль имел весь мой MVP-компонент в одном модуле. Это похоже на то, что Кинжал начинает искать зависимости в листе дерева и расстраиваться, когда он не видит, что в корне. Мне нужно, чтобы он пошел другим путем. Будьте удовлетворены тем, что я вложил зависимость в деятельность Root.

Базовая активность ...

@inject 
public ApiClient mClient; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mManager = new SharedPreferencesManager(this); 
    DaggerInjector.get().inject(this); 
} 

DaggerInjector

public class DaggerInjector { 
private static AppComponent appComponent = DaggerAppComponent.builder().appModule(new AppModule()).build(); 

public static AppComponent get() { 
    return appComponent; 
} 
} 



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

    void inject(BaseActivity activity); 


} 

Api

@Singleton 
@Component(modules = {ApiModule.class}) 
public interface ApiComponent { 
    void inject(BaseActivity activity); 
} 



@Module 
public class ApiModule { 

    @Provides 
    @Singleton 
    public ApiClient getApiClient(){ 
     return new ApiClient(); 
    } 
} 

Mvp

@Singleton 
@Component(modules = {MvpModule.class}) 
public interface MvpComponent { 
    void inject(BaseActivity activity); 
} 

@Module 
public class MvpModule { 

    @Provides 
    @Singleton 
    public MvpPresenter getMvpPresenter(){ return new MvpPresenter();} 
} 



Error:(16, 10) error: ApiClient cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. This type supports members injection but cannot be implicitly provided. 
ApiClient is injected at 
...BaseActivity.ApiClient 
...BaseActivity is injected at 
MvpComponent.inject(activity) 
+0

Я думаю, что этот вопрос у вас есть, что крестик пытается обеспечить 'A_Client' объект из' B_Component', который не существует там , Почему бы не иметь один компонент и установить там оба модуля? – benji

+0

Прямо сейчас B пусто и ничего не делает. Это будет мой ведущий MVP. Вы говорите, что есть один компонент, который выполняет MVP-код, мой сетевой код и 10 других несвязанных элементов? – StarWind0

+0

Я переименовал компоненты. А теперь Api и B теперь MVP. – StarWind0

ответ

0

Я выяснил свою проблему. Мне нужно было использовать подкомпонент.

@Singleton 
@Subcomponent(modules = {MvpModule.class}) 
public interface MvpComponent { 
    void inject(BaseActivity activity); 
} 

@Module 
public class MvpModule { 

    @Provides 
    @Singleton 
    public MvpPresenter getMvpPresenter(){ return new MvpPresenter();} 
} 

см

Dagger- Should we create each component and module for each Activity/ Fragment

Dagger2 activity scope, how many modules/components do i need?