【发布时间】:2016-02-12 21:37:29
【问题描述】:
我遇到了匕首2的一个非常奇怪的行为。也许我只是不明白。
所以我有 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 时,我得到了错误:
如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供 CustomNavigator。匕首 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,我已经更新了问题,在底部添加了活动
-
MakeDepositNavigator是您在模块中提供的接口吗? (你搞砸了一些重命名。)看起来没问题...我会检查你是否只使用界面 -
@DavidMedenjak,是的,这是我从
ActivityModule提供的界面 -
@DavidMedenjak 我不明白为什么我对
contextwrapper没有问题,它也是接口,但它注入没有任何问题
标签: android dependency-injection dagger-2