您必须将活动提供给负责构建myObject
的组件。要做到这一点的方法之一是创建一个ActivityScope
:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
在此范围内,您将创建用于注入活动的领域的inject()
方法的组成部分。
请注意,如果您想在MyActivityComponent
中使用该组件的对象图,则可以在更大范围的组件上添加依赖项。在这里,我使它取决于名为ApplicationComponent
的类。
@ActivityScope
@Component(
dependencies = {ApplicationComponent.class},
modules = { MyActivityModule.class}
)
public interface MyActivityComponent {
void inject(MyActivity myActivity);
}
该组件具有提供MyActivity
实例的模块。
@Module
public class MyActivityModule {
private final MyActivity myActivity;
public MyActivityModule(MyActivity myActivity) {
this.myActivity = myActivity;
}
@Provides
@ActivityScope
MyActivity provideActivity() {
return myActivity;
}
}
在你活动的onCreate()
,你现在可以给this
的模块,这使得它的ActivityScope
中可用。
//Inside your activity's onCreate:
DaggerMyActivityComponent.builder()
.myActivityModule(new MyActivityModule(this))
.build()
.inject(this);
编辑
在回答你的问题,你需要@Inject
注释构造函数中A
。这将给Dagger创建一个实例的方法。如果这是不可能的,你可以在模块中添加提供程序的方法,但它是一个有点更多的工作:
//Don't do this if you can annotate the constructor with @Inject.
@Provides
A provideA(MyActivity myActivity) {
return new A(myActivity);
}
我试过这个解决办法,但我得到了更多的错误: 错误:(22,10)错误: me.ha.colorselector.MainActivity不能提供没有@Inject构造函数或从@提供注释的方法。此类型支持成员注入,但不能隐式提供。 – Oussaki
@Oussaki啊,我忽略了那个。我为你编辑了我的答案。 –