こんにちは私は他の記事を読んだことがありますが、修正できません。基本的に私の問題は私が.injectを呼び出すことであり、フィールドを使用したいときはまだnullです。ダガー2ヌルフィールド注入
私はこのクラスを持っている:
public class Application extends Game implements IApplication {
@Inject IApplication app;
@Inject IRouter router;
public Application(IPlatformCode platformCode) {
}
@Override
public void create() {
initDagger();
System.out.println(app); //NULL
System.out.println(router); //NULL
router.showPage(Page.MenuPage); //NULL EXCEPTION
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 0.5f, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.render();
}
@Override
public void setPage(IPage page) {
setScreen(page);
}
protected void initDagger() {
ApplicationComponent.Initializer.init(this).inject(this);
RouterComponent.Initializer.init().inject(this);
}
}
私はアプリで同じことをやっているので、私はルータが表示されません。
私のアプリケーション・コンポーネントは、次のようになります。
@Singleton
@Component (modules = {ApplicationModule.class })
public interface ApplicationComponent {
void inject(IApplication application);
IApplication getApplication();
static final class Initializer {
private Initializer(){}
public static ApplicationComponent init(IApplication app) {
return DaggerApplicationComponent
.builder()
.applicationModule(new ApplicationModule(app))
.build();
}
}
}
そして、これはモジュールです:
@Module
public class ApplicationModule {
private IApplication app;
public ApplicationModule(IApplication app) {
this.app = app;
}
@Provides
@Singleton
public IApplication providesApplication(){
return app;
}
}
私の知る限り(IApplication)を注入呼び出した後に読んで@Inject IApplicationを注入する必要があると値を持っていますが、今はnullです。事前に
public final class DaggerApplicationComponent implements ApplicationComponent {
private Provider<IApplication> providesApplicationProvider;
private DaggerApplicationComponent(DaggerApplicationComponent.Builder builder) {
assert builder != null;
this.initialize(builder);
}
public static DaggerApplicationComponent.Builder builder() {
return new DaggerApplicationComponent.Builder();
}
private void initialize(DaggerApplicationComponent.Builder builder) {
this.providesApplicationProvider = DoubleCheck.provider(ApplicationModule_ProvidesApplicationFactory.create(builder.applicationModule));
}
public void inject(IApplication application) {
MembersInjectors.noOp().injectMembers(application);
}
public IApplication getApplication() {
return (IApplication)this.providesApplicationProvider.get();
}
public static final class Builder {
private ApplicationModule applicationModule;
private Builder() {
}
public ApplicationComponent build() {
if(this.applicationModule == null) {
throw new IllegalStateException(ApplicationModule.class.getCanonicalName() + " must be set");
} else {
return new DaggerApplicationComponent(this);
}
}
public DaggerApplicationComponent.Builder applicationModule(ApplicationModule applicationModule) {
this.applicationModule = (ApplicationModule)Preconditions.checkNotNull(applicationModule);
return this;
}
}
}
ありがとう:
生成されたコードは次のようになります。
プロジェクトを構築して、ダガーコードで生成されたものを確認してください。 'app'は本当に注入されていますか? 'DaggerApplicationComponent'と' DaggerRouterComponent'は正しく生成されていますか? 'ApplicationComponent'は本当に' ApplicationModule'から 'app'を提供していますか? – EgorD
私はDaggerApplicationComponentが正しく構築されるようにプロジェクトをビルドしました。私はそれが助けになる場合には、生成されたコードを投稿に追加します。 – mrk
'RouterComponent'は' ApplicationComponent'のサブコンポーネントですか? 1つの '@Singleton'コンポーネントしか持たないと思います。 私には分かりませんが、 'ApplicationComponent'のinitメソッドに渡しているのは、' Application'だけで、同じインスタンスを自分自身に注入するようです。これは、すべてが配線されていることをテストするためだけですか? – benji