web-dev-qa-db-ja.com

Dagger2-注入されたオブジェクトの代わりにnull

簡単にするために、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();
}
_

アクティビティでバリデーターを使用しようとすると、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
_

明らかに私は何かが欠けています。短剣が私のためにコンポーネントの実装を作成することを私は知っています。私はそれを使うべきですか?どうやって?

OnCreateメソッドで次のことを行うと:

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

その後、すべてが正常に動作します。

しかし、代わりに@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)そして最後に、私がいくつかのコンポーネントを地獄の線としてそれらの2つの醜いものを注入したいアクティビティクラスで:

_component = ((EmailSenderApplication) getApplication()).component();
component.inject(this);
_
13
slnowak

次のようにコンポーネントをビルドする必要があるようです。

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

通常、これはアプリケーションのonCreateメソッドで行います。

あなたを助けるかもしれない1つの良いリソースは Dagger 2リポジトリのサンプルアプリ です。

Jake Whartonのu2020サンプルアプリへの更新の提案 (メインのDagger 2エンジニアから)から、このPRも役に立ちました。 Dagger 1から2に移行するときに行う必要のある変更の概要がわかります。明らかに、それが 彼は人々にも指摘しています です。

13
gMale