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

Ous*_*aki 3 java android dependency-injection dagger-2

假设我有一个这样A定义的类:

class A {

    Activity c;

    public A(Activity c) {
        this.c = c;
        // do something
    }

    public void dosomething() { }

}
Run Code Online (Sandbox Code Playgroud)

我有一个这样定义的活动:

public class MyActivity extends AppCompatActivity {

    @Inject A myObject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myObject.dosomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 6

您必须使负责构建myObject. 一种方法是创建一个ActivityScope

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
Run Code Online (Sandbox Code Playgroud)

在此范围内,您可以使用inject()注入活动字段的方法创建一个组件。

请注意,如果您希望该组件的对象图在您的MyActivityComponent. 在这里,我让它依赖于一个名为ApplicationComponent.

@ActivityScope
@Component(
        dependencies = {ApplicationComponent.class}, 
        modules = { MyActivityModule.class}
)
public interface MyActivityComponent {

    void inject(MyActivity myActivity);

}
Run Code Online (Sandbox Code Playgroud)

该组件有一个提供MyActivity实例的模块。

@Module
public class MyActivityModule {

    private final MyActivity myActivity;

    public MyActivityModule(MyActivity myActivity) {
        this.myActivity = myActivity;
    }

    @Provides
    @ActivityScope
    MyActivity provideActivity() {
        return myActivity;
    }

}
Run Code Online (Sandbox Code Playgroud)

在您的活动的 中onCreate(),您现在可以提供this给模块,这使其在ActivityScope.

//Inside your activity's onCreate:
DaggerMyActivityComponent.builder()
        .myActivityModule(new MyActivityModule(this))
        .build()
        .inject(this);
Run Code Online (Sandbox Code Playgroud)

编辑
为了回答您的问题,您需要A使用@Inject. 这将为 Dagger 提供一种创建它的实例的方法。如果这是不可能的,您可以在模块中添加一个提供程序方法,但需要做更多的工作:

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