dagger没有为我的子类提供依赖

时间:2018-01-10 09:17:04

标签: android dagger-2

我有一个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中的所有订阅。

2 个答案:

答案 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