簡體   English   中英

如何將當前要注入的活動傳遞給Dagger2中的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM