14

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

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();
}

当尝试在活动中使用我的验证器时,我得到一个空指针异常:

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();

然后一切正常。

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

我错过了什么?

我用 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;
    }
}

2) 在 AndroidManifest.xml 中:

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

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

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

1 回答 1

14

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

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

通常,您在onCreate应用程序的方法中执行此操作。

Dagger 2 repo 中的示例应用程序可能对您有所帮助。

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

于 2015-02-26T01:39:08.710 回答