理论上,你可以这样做。
1.) 指定子范围
@Scope
@Retention(RUNTIME)
public @interface PerActivity {
}
2.) 指定父组件
@Singleton
@Component(modules={Module1.class, Module2.class)
public interface MyApplicationComponent {
Dependency1 providesDependency1();
Dependency2 providesDependency2();
}
3.) 指定子组件
@PerActivity
@Component(dependencies={MyApplicationComponent.class}, modules={Module3.class})
public interface MyBaseActivityComponent extends MyApplicationComponent {
void inject(BaseActivity baseActivity);
Dependency3 providesDependency3();
}
4.) 创建您的模块
@Module
public class Module3 {
@Provides
@PerActivity
public Dependency3 providesDependency3() {
return new Dependency3();
}
}
5.) 创建 Activity 级别的作用域组件
public class BaseActivity extends AppCompatActivity {
private MyBaseActivityComponent baseComponent;
@Override
public void onCreate(Bundle saveState) {
super.onCreate(saveState);
baseComponent = DaggerBaseActivityComponent.builder()
.applicationComponent(((MyApp)getApplication()).component())
.build();
}
public MyBaseActivityComponent baseComponent() {
return baseComponent;
}
@Override
public void onDestroy() {
component = null;
super.onDestroy();
}
}
如果有效,请回复,之前我忘记在我的中指定依赖项Component
并出现编译错误,但它应该像这样工作。
另外,如果您需要为每个指定一个子组件Activity
,那么您只需在中使用提供方法指定依赖项BaseActivityComponent
成分...
@PerActivity
@Component(dependencies={MyBaseActivityComponent.class}, modules={Module4.class})
public interface MyActivityComponent extends MyBaseActivityComponent {
public void inject(MyActivity myActivity);
Dependency4 providesDependency4();
}
@Module
public class Module4 {
@PerActivity
@Provides
public Dependency4 providesDependency4(Dependency3 dependency3) {
return new Dependency4(dependency3);
}
}
public class MyActivity extends MyBaseActivity {
private MyActivityComponent component;
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
component = DaggerMyActivityComponent.builder()
.applicationComponent(((MyApp)getApplication()).component())
.myBaseActivityComponent(baseComponent())
.build();
}
@Override
public void onDestroy() {
component = null;
super.onDestroy();
}
}
EDIT: @Subcomponent
根据以下内容,使用子组件工厂方法替换组件依赖关系the docs http://google.github.io/dagger/api/latest/dagger/Component.html仅当您使用以下模式时(也称为使用供应/工厂方法定义将子组件嵌入父组件中):
@Singleton @Component
interface ApplicationComponent {
// component methods...
RequestComponent newRequestComponent(RequestModule requestModule);
}
Where
@Subcomponent(modules={RequestModule.class})
interface RequestComponent {
RequestSomething requestSomething();
}