如何将当前活动传递给Dagger2中的对象

时间:2017-08-19 17:15:49

标签: java android dependency-injection dagger-2

假设我有一个类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();
    }
}

如何向我的对象提供当前活动?

1 个答案:

答案 0 :(得分:3)

您必须将活动提供给负责构建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);

修改
在回答您的问题时,您需要使用A@Inject中注释构造函数。这将为Dagger提供一种创建它实例的方法。如果那是不可能的,你可以在模块中添加一个提供者方法,但它还有点工作:

//Don't do this if you can annotate the constructor with @Inject.
@Provides
A provideA(MyActivity myActivity) {
    return new A(myActivity);
}