代码之家  ›  专栏  ›  技术社区  ›  Marc

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

  •  0
  • Marc  · 技术社区  · 6 年前

    我有一个基本活动和一个儿童活动。在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中的订阅为空?我想在取消订阅BaseActivity中的所有订阅时,将来自ChildActivity的订阅添加到该订阅中。

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Medenjak    6 年前

    Dagger只知道 BaseActivity 而且不知道 ChildActivity 不管怎样你所要做的就是声明 基本活动 应该在这里进行现场注入

    void inject(BaseActivity activity); // mark BaseActivity for injection
    

    这不包括其子级。如果您用这个调用注入一个孩子,那么您将只注入parents字段。

    要修复它,您还需要向Dagger注册子活动,以便Dagger生成适当的代码来注入您的子活动字段。

    void inject(ChildActivity activity); // register child as well
    

    但是,在您的特定用例中,子活动最好访问parents属性,而不是在子活动中声明具有相同名称的属性。

        2
  •  0
  •   Christopher    6 年前

    在您的 AppComponent 您必须添加 inject 每个子类的方法:

    @Component(modules = AppModule.class)  
    @Singleton
    public interface AppComponent {
      void inject(BaseActivity activity);
      void inject(ChildActivity activity);
      void inject(IndexFragment fragment);
    }
    

    作为改进,您可能希望使用 Dagger-Android .