You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dagger无法为子类提供依赖:ChildActivity中subscriptions为空问题

为啥ChildActivity里的subscriptions总是null?我来帮你搞定!

你的问题其实是Dagger 2注入逻辑的一个常见坑——Dagger的注入方法是严格匹配具体类型的,再加上你在子类里重复声明了注入字段,才导致了这个问题。

问题根源拆解

  • 你的AppComponent里只定义了void inject(BaseActivity activity);,没有针对ChildActivity的注入方法。当你在ChildActivity里调用appComponent.inject(this)时,Dagger找不到对应的注入逻辑,自然不会给你初始化subscriptions。
  • 更关键的是,你在BaseActivity和ChildActivity里都声明了@Inject CompositeSubscription subscriptions;,这完全是冗余操作——你本来的需求是在父类统一管理订阅,根本不需要子类再搞一个独立的实例。

最优解决方案(完全符合你的需求)

直接复用父类的subscriptions实例,不要在子类重复声明注入字段:

修改ChildActivity

public class ChildActivity extends BaseActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 直接用父类的subscriptions就行,不用再注入
        subscriptions.add(/* 你的RxJava订阅代码 */);
    }
}

优化BaseActivity(可选但推荐)

把subscriptions改成protected修饰符,让子类可以直接访问,同时在onDestroy里统一取消订阅,完美实现你的需求:

public class BaseActivity extends AppCompatActivity {
    @Inject protected CompositeSubscription subscriptions;
    AppComponent appComponent;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(getApplication()))
                .build();
        appComponent.inject(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 父类统一清理所有订阅
        subscriptions.clear();
    }
}

不推荐的方案(仅作了解)

如果非要在子类里声明注入字段,那你得在AppComponent里添加对应的注入方法:

@Component(modules = AppModule.class)
@Singleton
public interface AppComponent {
    void inject(BaseActivity activity);
    void inject(ChildActivity activity); // 新增这一行
    void inject(IndexFragment fragment);
}

但这样会导致父类和子类各有一个独立的CompositeSubscription实例,完全违背了你“统一取消订阅”的初衷,所以千万别这么干!

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:19