[英]How to pass the current activity to be Injected to an Object in Dagger2
假設我有一個A
定義的A
類:
class A {
Activity c;
public A(Activity c) {
this.c = c;
// do something
}
public void dosomething() { }
}
我有一個這樣定義的活動:
public class MyActivity extends AppCompatActivity {
@Inject A myObject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myObject.dosomething();
}
}
如何為對象提供當前活動?
您必須使活動對負責構造myObject
的組件可用。 一種方法是創建一個ActivityScope
:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
在此范圍內,您將創建一個帶有inject()
方法的組件,用於注入Activity的字段。
請注意,如果希望在MyActivityComponent
使用該組件的對象圖,則可以在范圍更廣的組件上添加依賴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提供創建其實例的方法。 如果這不可能,則可以在模塊中添加provider方法,但這需要更多工作:
//Don't do this if you can annotate the constructor with @Inject.
@Provides
A provideA(MyActivity myActivity) {
return new A(myActivity);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.