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
相关产品推荐
相关产品推荐

