首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dagger没有为我的子类提供依赖关系。

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

Stack Overflow用户
提问于 2018-01-10 09:17:03
回答 2查看 83关注 0票数 0

我有一个BaseActivity和一个ChildActivity。在BaseActivity中,我创建了依赖关系图:

代码语言:javascript
复制
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中使用订阅,但它是空的:

代码语言:javascript
复制
public class ChildActivity extends BaseActivity {

@Inject CompositeSubscription subscriptions;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    appComponent.inject(this);
}

我的AppComponent看起来像:

代码语言:javascript
复制
@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
    void inject(BaseActivity activity);
    void inject(IndexFragment fragment);
}

而我的AppModule看起来

代码语言:javascript
复制
@Module
public final class AppModule {
    Application application;

    public AppModule(Application application) {
    this.application = application;
    }

    @Provides
    @Singleton
    CompositeSubscription provideSubscriptionManager() {
        return new CompositeSubscription();
    }

为什么订阅在ChildActivity中为空?我想从ChildActivity中添加订阅,同时取消订阅BaseActivity中的所有订阅。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 09:24:46

匕首只知道BaseActivity,对ChildActivity一无所知。您所做的就是声明应该在这里注入BaseActivity

代码语言:javascript
复制
void inject(BaseActivity activity); // mark BaseActivity for injection

这不包括其子女。如果使用此调用向子节点注入,则只会注入父字段。

要修复它,还需要向Dagger注册子活动,这样Dagger将生成适当的代码注入您的ChildActivitys字段。

代码语言:javascript
复制
void inject(ChildActivity activity); // register child as well

但是,在您的特定用法中,子活动最好访问父属性,而不是在子属性中声明同名属性。

票数 1
EN

Stack Overflow用户

发布于 2018-01-10 09:23:37

AppComponent中,必须为每个子类添加一个inject方法:

代码语言:javascript
复制
@Component(modules = AppModule.class)  
@Singleton
public interface AppComponent {
  void inject(BaseActivity activity);
  void inject(ChildActivity activity);
  void inject(IndexFragment fragment);
}

作为一种改进,您可能需要使用匕首-Android

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48183930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档