Dagger2 - null而不是注入对象

sln*_*wak 12 android dagger-2

为简单起见,假设我想将apache验证器中的EmailValidator注入我的活动中:

public class MainActivity extends FragmentActivity {

    @Inject
    EmailValidator emailValidator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
Run Code Online (Sandbox Code Playgroud)

我有一个MainModule类:

@Module
public class MainModule {

    @Provides
    public EmailValidator providesEmailValidator() {
        return EmailValidator.getInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)

和MainComponent接口:

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

    EmailValidator getEmailValidator();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在活动中使用我的验证器时,我得到一个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
Run Code Online (Sandbox Code Playgroud)

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

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

        emailValidator = Dagger_MainComponent.create().getEmailValidator();
Run Code Online (Sandbox Code Playgroud)

一切正常.

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

我错过了什么?

我用dagger1做了类似的事情并且它起作用了.当然我需要打电话给ObjecGraph.inject(this)活动.什么是dagger2等同物?

编辑:

好的,所以我找到了解决方案.如果有人会有这样的问题,有一些片段:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

2)在AndroidManifest.xml中:

<application
        android:name=".EmailSenderApplication"
        ...
Run Code Online (Sandbox Code Playgroud)

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

component = ((EmailSenderApplication) getApplication()).component();
component.inject(this);
Run Code Online (Sandbox Code Playgroud)

gMa*_*ale 13

看起来您需要构建组件,如下所示:

component = Dagger_ MainComponent.builder()
        .mainModule(new MainModule())
        .build();
Run Code Online (Sandbox Code Playgroud)

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

可以帮助您的一个好资源是Dagger 2 repo中示例应用程序.

我还发现这个PR很有帮助,从建议的更新到Jake Wharton的u2020示例应用程序(来自主Dagger 2工程师).它很好地概述了从Dagger 1到2时需要做出的改变,显然这也是他对人们的看法.

  • 我讨厌匕首.如此头痛的工作 (3认同)