簡単にするために、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);
_
次のようにコンポーネントをビルドする必要があるようです。
component = Dagger_ MainComponent.builder()
.mainModule(new MainModule())
.build();
通常、これはアプリケーションのonCreate
メソッドで行います。
あなたを助けるかもしれない1つの良いリソースは Dagger 2リポジトリのサンプルアプリ です。
Jake Whartonのu2020サンプルアプリへの更新の提案 (メインのDagger 2エンジニアから)から、このPRも役に立ちました。 Dagger 1から2に移行するときに行う必要のある変更の概要がわかります。明らかに、それが 彼は人々にも指摘しています です。