Здравствуйте, я новичок в 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)
Я думаю, что этот вопрос у вас есть, что крестик пытается обеспечить 'A_Client' объект из' B_Component', который не существует там , Почему бы не иметь один компонент и установить там оба модуля? – benji
Прямо сейчас B пусто и ничего не делает. Это будет мой ведущий MVP. Вы говорите, что есть один компонент, который выполняет MVP-код, мой сетевой код и 10 других несвязанных элементов? – StarWind0
Я переименовал компоненты. А теперь Api и B теперь MVP. – StarWind0