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啊,我忽略了这一点。我为你编辑了我的答案。