匕首没有为我的子类提供依赖关系



我有一个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。

最新更新