Android Dagger2-null而不是注入对象

Android Dagger2-null而不是注入对象,android,dagger-2,Android,Dagger 2,为了简化操作,假设我想将来自apache validators的EmailValidator注入到我的活动中: public class MainActivity extends FragmentActivity { @Inject EmailValidator emailValidator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreat

为了简化操作,假设我想将来自apache validators的EmailValidator注入到我的活动中:

public class MainActivity extends FragmentActivity {

    @Inject
    EmailValidator emailValidator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
我有一个主模块类:

@Module
public class MainModule {

    @Provides
    public EmailValidator providesEmailValidator() {
        return EmailValidator.getInstance();
    }
}
和主组件接口:

@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {

    EmailValidator getEmailValidator();
}
在活动中尝试使用我的验证器时,我遇到一个nullpointer异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference
很明显我错过了什么。我知道dagger为我创建了组件实现。我应该用它吗?怎么做

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

        emailValidator = Dagger_MainComponent.create().getEmailValidator();
然后一切正常

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

我错过了什么?

我用dagger1做了类似的事情,效果很好。当然,我需要在活动中调用
ObjecGraph.inject(this)
。匕首2的等效物是什么

编辑:

好的,我找到了一个解决方案。如果有人会遇到这样的问题,这里有一些片段:

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

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"
        ...

看起来您需要按照以下步骤构建组件:

component = Dagger_ MainComponent.builder()
        .mainModule(new MainModule())
        .build();
通常,您可以在应用程序的
onCreate
方法中执行此操作

一个可以帮助你的好资源是


我还发现这个公关很有帮助,从一个(从主匕首2工程师)。它很好地概述了从Dagger 1到Dagger 2需要做的更改,显然这就是我想出来的。由于有用的链接,我接受这个答案:)很高兴你把它修好了!从上面的编辑来看,您的模块构造函数似乎都不需要构造函数参数。如果这是真的,组件将有一个
create
方法供您使用。不过,很有可能,过一段时间后,您需要将应用程序传递到其中一个模块,当这种情况发生时,您将不得不退回到使用上述生成器。是的,我知道这一点,但谢谢。;)缺少的部分是组件。有人能解释为什么会这样吗?我在我的应用程序中通过尝试和错误纠正了这一点,但不太明白其中的道理。在我的例子中,我有一个构建组件并注入自身的活动。然后,控制器将被注入到活动中,但始终为空,直到我将控制器作为参数再次注入到组件中。在我的情况下,我已在我的应用程序对象中注入依赖项,因此我必须注入。您的案例听起来不一样,但好消息是,由于代码是生成的,您只需跟踪您在IDE中询问的特定
inject
调用,就可以确切地了解为什么需要它。我无法在我的组件上调用
inject
。此外,Dagger_MainComponent语法似乎已更改为DaggerComponent。
component = Dagger_ MainComponent.builder()
        .mainModule(new MainModule())
        .build();