您必須將活動提供給負責構建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啊,我忽略了那個。我爲你編輯了我的答案。 –