我有一个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中使用订阅,但它是空的:
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中的所有订阅。
发布于 2018-01-10 09:24:46
匕首只知道BaseActivity,对ChildActivity一无所知。您所做的就是声明应该在这里注入BaseActivity
void inject(BaseActivity activity); // mark BaseActivity for injection这不包括其子女。如果使用此调用向子节点注入,则只会注入父字段。
要修复它,还需要向Dagger注册子活动,这样Dagger将生成适当的代码注入您的ChildActivitys字段。
void inject(ChildActivity activity); // register child as well但是,在您的特定用法中,子活动最好访问父属性,而不是在子属性中声明同名属性。
发布于 2018-01-10 09:23:37
在AppComponent中,必须为每个子类添加一个inject方法:
@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
void inject(BaseActivity activity);
void inject(ChildActivity activity);
void inject(IndexFragment fragment);
}作为一种改进,您可能需要使用匕首-Android。
https://stackoverflow.com/questions/48183930
复制相似问题