Я столкнулся с очень странным поведением кинжала 2. Возможно, я просто не понимаю.Не может быть предоставлен без @ Provides- или @ Produces-аннотированного метода
Поэтому у меня есть 2 компонента:
AppComponent:
@Singleton
@Component(modules = {/*my modules*/})
public interface AppComponent extends AppGraph {
@ForApplication Context getContext();
}
ActivityComponent:
@ForActivity
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class})
public interface ActivityComponent extends AppComponent {
void inject(BaseActivity activity);
@ForActivity
BaseActivity getActivity();
}
ForApplication:
@Qualifier
@Retention(RUNTIME)
public @interface ForApplication {
}
ForActivity:
@Scope
@Retention(RUNTIME)
public @interface ForActivity {
}
А также, у меня есть ActivityModule
, который имеет provides
методы:
@Module
public class ActivityModule {
private final BaseActivity activity;
public ActivityModule(BaseActivity activity) {
this.activity = activity;
}
@ForActivity
@Provides
public BaseActivity provideActivityContext(){
return activity;
}
@Provides
public ContextWrapper provideContextWrapper(){
return new ContextWrapperImpl(activity);
}
@Provides
public CustomNavigator provideMakeDepositNavigator(){
return new CustomNavigatorImpl(activity);
}
}
Так что, когда я впрыснуть ContextWrapper
в моей деятельности, я не получайте ошибок.
Но когда я впрыснуть CustomNavigatorImpl
, я получаю ошибку:
CustomNavigator cannot be provided without an @Provides- or @Produces-annotated method. Dagger 2
Эти 2 интерфейсов одинаковы.Но ContextWrapper
впрыскивается и CustomNavigator
не
ContextWrapper
:
public interface ContextWrapper {
String getString(int resId);
Context getContext();
}
MakeDepositNavigator:
public interface MakeDepositNavigator {
void showSomething1();
void showSomething2();
void showSomething3();
/*...*/
}
В классе приложения я создаю DaggerAppComponent
:
DaggerSdkAppComponent.builder()
.applicationModule(new ApplicationModule(c))
.build();
В BaseActivity
я создаю ActivityComponent
:
AppComponent component = ((HasComponent<AppComponent>)
getApplicationContext())
.getComponent();
mComponent = DaggerActivityComponent.builder()
.activityModule(new ActivityModule(this))
.appComponent(component)
.build();
Также BaseActivity
имеет метод:
@Override
public ActivityComponent getComponent() {
return mComponent;
}
И в CustomActivity
, который простирается от BaseActivity
я:
getComponent().inject(this);
ОБНОВЛЕНО
Activity:
public class MakeDepositActivity extends BaseActivity{
/* some code */
@Inject
public MakeDepositNavigator makeDepositNavigator;
@Inject
public ContextWrapper cw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_make_deposit);
getComponent().inject(this);
/* some code */
}
/* some code */
}
Не могли бы вы также добавить код своей деятельности с полями, которые вы пытаетесь ввести? –
@DavidMedenjak, я обновил вопрос, добавил активность с поданной до нижней – Alexander
'MakeDepositNavigator' - это интерфейс, который вы предоставляете в своем модуле? (Вы перепутали некоторые переименования.) Это выглядит хорошо ... Я бы проверял, если вы просто используете интерфейс –