我有一个BaseActivity和一个ChildActivity。 在基本活动中,我创建了我的依赖关系图:
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。 我还想在子活动中使用订阅,但它为空:
public class ChildActivity extends BaseActivity {
@Inject CompositeSubscription subscriptions;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appComponent.inject(this);
}
我的应用组件如下所示:
@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
void inject(BaseActivity activity);
void inject(IndexFragment fragment);
}
虽然我的应用程序模块看起来像
@Module
public final class AppModule {
Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
@Singleton
CompositeSubscription provideSubscriptionManager() {
return new CompositeSubscription();
}
为什么子活动中的订阅为空? 我想添加来自ChildActivity的订阅,同时取消订阅BaseActivity中的所有订阅。
dagger只知道BaseActivity
,对ChildActivity
一无所知。您要做的就是声明BaseActivity
应该在此处进行现场注入
void inject(BaseActivity activity); // mark BaseActivity for injection
这不包括其子项。如果通过此调用向子项注入,则只会注入父字段。
要修复它,您还需要使用 Dagger 注册子活动,以便 Dagger 将生成正确的代码来注入您的 ChildActivitys 字段。
void inject(ChildActivity activity); // register child as well
不过,在您的特定用例中,子活动最好访问 parent 属性,而不是在子项中声明具有相同名称的属性。
在AppComponent
中,您必须为每个子类添加一个inject
方法:
@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
void inject(BaseActivity activity);
void inject(ChildActivity activity);
void inject(IndexFragment fragment);
}
作为改进,您可能希望使用Dagger-Android。