嗨我已閱讀其他帖子,但我無法修復它。基本上我的問題是,我打電話.inject,當我想使用該字段仍然爲空。Dagger 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應注射和有一個值,但現在它是空的。
生成的代碼看起來是這樣的:提前
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;
}
}
}
感謝。
嘗試構建您的項目並查看由Dagger代碼生成的內容。 'app'真的注入了嗎? 'DaggerApplicationComponent'和'DaggerRouterComponent'是否正確生成? 'ApplicationComponent'是否真的從'ApplicationModule'提供'app'? – EgorD
我沒有構建項目,所以DaggerApplicationComponent應該被正確構建。我將生成的代碼添加到帖子中,以防它幫助。 – mrk
「RouterComponent」應該是「ApplicationComponent」的一個子組件嗎?我想你可能只有一個'@ Singleton'組件。 另一件我不清楚的事情,似乎是你將'ApplicationComponent'的init方法傳遞給'Application',只是爲了將同一個實例注入到它自己中。這僅僅是爲了測試,所有東西都連接起來了嗎? – benji