使用Dagger 2依赖注入后对象始终返回null问题求助
我尝试使用Dagger 2实现依赖注入,但注入后的对象始终返回null。我认为配置流程无误,但问题仍未解决。以下是相关代码:
Application类
public class ApplicationSA extends Application { private static AppComponent appComponent; @Override public void onCreate() { super.onCreate(); appComponent = DaggerAppComponent.create(); } public static AppComponent getComponent() { return appComponent; } }
Component接口
@Component(modules = { SnoreDetectorClass.class, ... }) public interface AppComponent { // 此处缺少注入方法声明 }
咱们一步步拆解这个问题,Dagger 2注入返回null基本都是几个常见环节没做到位,我给你列几个核心排查点:
Component必须声明注入方法
你贴的Component代码里没看到针对目标类的注入方法,比如要给Activity注入依赖,必须在AppComponent里明确声明:void inject(MainActivity activity);没有这个方法,Dagger不知道要把依赖注入到哪个类中,自然不会生成对应的注入逻辑。
目标类中必须主动调用注入
比如在你的Activity里,得在合适的生命周期方法(比如onCreate)里触发注入:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ApplicationSA.getComponent().inject(this); // 一定要在注入完成后再使用对象,不然会提前拿到null }跳过这一步的话,Dagger根本没机会把实例注入到字段里。
Module类的注解不能少
你Component里引用的SnoreDetectorClass如果是提供依赖的Module,必须加上@Module注解,而且里面提供实例的方法要加@Provides:@Module public class SnoreDetectorModule { @Provides SnoreDetector provideSnoreDetector() { return new SnoreDetector(); } }要是这个类不是Module却放在
modules参数里,Dagger完全无法识别依赖来源。注入字段必须加@Inject注解
目标类里需要被注入的字段,必须标记@Inject:public class MainActivity extends AppCompatActivity { @Inject SnoreDetector snoreDetector; // 没有这个注解,Dagger不知道要注入这个字段 // ... }确认Dagger生成代码正常
先Rebuild项目,检查是否生成了DaggerAppComponent类。如果生成失败,去Build Output里找错误提示——通常是注解漏加、依赖声明错误这类小问题。Application要在Manifest中注册
别忘了在AndroidManifest.xml里把ApplicationSA设为Application类,不然它的onCreate不会执行,appComponent本身就是null:<application android:name=".ApplicationSA" <!-- 其他配置 --> >
你可以从这几个点逐一排查,尤其是注入方法和字段注解这两个最容易忽略的环节,大概率能解决问题。
内容的提问来源于stack exchange,提问作者abrutsze

