我有一个BaseActivity和一个ChildActivity。在BaseActivity中,我创建了我的依赖图:
public class BaseActivity extends AppCompatActivity {
@Inject CompositeSubscription subscriptions;
AppComponent appComponent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(getApplication()))
.build();
appComponent.inject(this);
}
在同一个包中有ChildActivity。我也想在ChildActivity中使用订阅,但它是null:
public class ChildActivity extends BaseActivity {
@Inject CompositeSubscription subscriptions;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appComponent.inject(this);
}
我的AppComponent看起来像:
@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
void inject(BaseActivity activity);
void inject(IndexFragment fragment);
}
虽然我的AppModule看起来像
@Module
public final class AppModule {
Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
@Singleton
CompositeSubscription provideSubscriptionManager() {
return new CompositeSubscription();
}
为什么ChildActivity中的订阅为空?我想在ChildActivity中添加订阅,同时取消订阅BaseActivity中的所有订阅。
答案 0 :(得分:1)
Dagger只知道BaseActivity
并且不了解ChildActivity
。你要做的就是声明BaseActivity
应该是现场注入的,这里是
void inject(BaseActivity activity); // mark BaseActivity for injection
这不包括其子女。如果您通过此调用注入一个孩子,您将只注入父母字段。
要修复它,您还需要使用Dagger注册子活动,以便Dagger生成正确的代码以注入您的ChildActivitys字段。
void inject(ChildActivity activity); // register child as well
在您的特定用例中,子活动访问parent属性可能更好,而不是在子级中声明具有相同名称的属性。
答案 1 :(得分:0)
在AppComponent
中,您必须为每个子类添加inject
方法:
@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
void inject(BaseActivity activity);
void inject(ChildActivity activity);
void inject(IndexFragment fragment);
}
作为改进,您可能希望使用Dagger-Android。