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