Dagger 2调用create方法出现空对象引用,请求排查错误原因
老哥,我帮你捋捋这个Dagger 2空指针的坑——你现在遇到的presenter空对象引用,核心原因就是Dagger没把Presenter实例正确注入到你的SplashActivity里。我给你拆解几个最常见的问题和解决办法:
1. 组件(Component)的方法定义不对,没做注入操作
你当前的AppComponent只定义了返回Presenter的方法,但Dagger给Activity注入字段的正确姿势是给Component添加一个inject方法,接收你的Activity实例,而不是返回Presenter。因为@Inject标记的字段是靠Component的inject方法来完成赋值的,不是你手动去get然后赋值。
修改你的AppComponent代码:
@Component(modules = SplashModule.class) public interface AppComponent { // 替换原来的getSplashWithDiPresenter方法,添加注入Activity的方法 void inject(SplashActivity activity); }
然后在SplashActivity的onCreate里,必须调用Dagger生成的Component来完成注入:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash_with_di); // 初始化Dagger生成的组件,并注入当前Activity DaggerAppComponent.create().inject(this); // 现在presenter就不会为空了,再调用方法 presenter.getAppVersion(); }
2. 确认SplashModule正确提供了Presenter实例
你的SplashModule内容没贴出来,但要确保它能正确提供SplashPresenter的实例。有两种方式:
- 方式一:给Module添加@Provides方法
@Module public class SplashModule { @Provides SplashPresenter provideSplashPresenter() { // 返回你的Presenter实现类实例,比如SplashPresenterImpl return new SplashPresenterImpl(); } }
- 方式二:如果你的Presenter实现类(比如SplashPresenterImpl)的构造函数加了
@Inject注解,那Module可以不用写@Provides方法,但要确保Component能扫描到这个类。
3. 检查Dagger是否生成了对应的组件类
如果你的代码里找不到DaggerAppComponent,说明Dagger没生成这个类,大概率是你的注解配置有问题(比如Component的modules引用错误、Module里的方法不符合要求)。这时候你需要重新编译项目(Build -> Rebuild Project),让Dagger生成对应的代码。
4. 排查BaseActivity是否影响注入流程
如果你的SplashActivity继承了BaseActivity,要确认BaseActivity里有没有做Dagger相关的初始化逻辑,有没有覆盖或者破坏了注入流程。比如BaseActivity是否已经初始化了Component,或者是否需要在BaseActivity里统一处理注入,避免重复代码。
按照上面的步骤排查,基本就能解决这个空指针问题了!
内容的提问来源于stack exchange,提问作者anil

