我面臨着匕首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
這兩個接口是相同的。但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'是您在模塊中提供的接口嗎? (你搞砸了一些重命名的)。它看起來好了...我會檢查,如果你只是使用接口 –