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

Java 如何将要注入的当前活动传递到Dagger2中的对象,java,android,dependency-injection,dagger-2,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

假设我有一个类
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();
    }
}
我有一个定义如下的活动:

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()
方法创建一个组件,用于注入活动的字段

请注意,如果希望组件的对象图在
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()
中,您现在可以将
提供给模块,从而使其在
活动范围内可用

//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);
}

我尝试过这个解决方案,但我得到了更多错误:错误:(22,10)错误:如果没有@Inject构造函数或@Providers注释方法,则无法提供me.ha.colorselector.MainActivity。此类型支持成员注入,但不能隐式提供。@Oussaki啊,我忽略了这一点。我为你编辑了我的答案。