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

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

1 に答える 1

14

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

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

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

Dagger 2 リポジトリのサンプル アプリは、役立つリソースの 1 つです。

Jake Wharton の u2020 サンプル アプリ(メインの Dagger 2 Engineer から)への提案された更新から、この PR も役に立ちました。ダガー 1 から 2 に移行する際に必要な変更の概要がよくわかります

于 2015-02-26T01:39:08.710 に答える