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)
如何为我的对象提供当前活动?
您必须使负责构建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)
| 归档时间: |
|
| 查看次数: |
1326 次 |
| 最近记录: |