Dagger2 – null而不是注入的对象

为了简单起见,假设我想从apachevalidation器中注入EmailValidator到我的activity中:

public class MainActivity extends FragmentActivity { @Inject EmailValidator emailValidator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 

我有一个MainModule类:

 @Module public class MainModule { @Provides public EmailValidator providesEmailValidator() { return EmailValidator.getInstance(); } } 

和MainComponent接口:

 @Singleton @Component(modules = MainModule.class) public interface MainComponent { EmailValidator getEmailValidator(); } 

当试图在活动中使用我的validation器时,我得到一个空指针exception:

 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference 

显然我错过了一些东西。 我知道匕首为我创build了组件实现。 我应该使用它吗? 怎么样?

如果我在我的onCreate方法中执行以下操作:

  emailValidator = Dagger_MainComponent.create().getEmailValidator(); 

那么一切正常。

但是我希望能够在任何地方使用@Inject注解(可能在setter / constructor而不是字段)。

我错过了什么?

我做了类似的匕首1,它的工作。 当然,我需要在活动中调用ObjecGraph.inject(this) 。 什么是匕首2相当于?

编辑:

好的,所以我find了一个解决scheme。 如果有谁会有这样的问题,有一些片段:

1)我创build了一个应用程序类:

 public class EmailSenderApplication extends Application { private MainComponent component; @Override public void onCreate() { super.onCreate(); component = Dagger_MainComponent .create(); component.inject(this); } public MainComponent component() { return component; } } 

2)在AndroidManifest.xml中:

 <application android:name=".EmailSenderApplication" ... 

3)最后,在我想要注入一些组件的活动课,这两个丑陋的地狱线:

 component = ((EmailSenderApplication) getApplication()).component(); component.inject(this); 

Solutions Collecting From Web of "Dagger2 – null而不是注入的对象"

看起来像你需要build立你的组件如下:

 component = Dagger_ MainComponent.builder() .mainModule(new MainModule()) .build(); 

通常, 以这种方式在应用程序的onCreate方法中执行此操作 。

一个很好的资源,可以帮助你在Dagger 2回购示例应用程序 。

我也发现这个公关很有帮助,从build议更新到杰克·沃顿的u2020示例应用程序 (从主匕首2工程师)。 它可以很好地概括你从Dagger 1到2所做的改变,显然这也是他指出的 。