Dagger 2 空场注入
Dagger 2 Null field injection
您好,我已经阅读了其他帖子,但我无法修复它。基本上我的问题是我调用 .inject 并且当我想使用该字段时它仍然为空。
我有这个class:
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;
}
}
据我在调用 inject(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 2 组件的创建是在 class 扩展 Android 的一个应用程序 class 中完成的。这样做主要是为了确保这些组件(以及它们所包含的依赖项)仅被实例化一次。 (有关详细信息,请参阅 Dagger 文档:https://google.github.io/dagger/users-guide)
虽然我没有看到任何说明您不能以不同方式连接它的内容,但我也没有找到它的示例。我想知道是否尝试使用您正在进行的 Initializer.init() 调用即时连接组件是否以某种方式绕过了 Dagger 正确设置组件以进行注入的能力。是否可以将组件 classes 的实例化重构为应用程序实现?
上面的代码看起来应该可以工作(除了通过每次 init() 调用而不是 Singleton 获取一个新的 DaggerApplicationComponent 实例之外),我无法真正解释为什么它不能工作。
你的注入方法
void inject(IApplication application);
需要改为
void inject(Application application);
请注意从 IApplication 到 Application 的变化。你不能为注入方法使用接口,你需要使用 class.
您好,我已经阅读了其他帖子,但我无法修复它。基本上我的问题是我调用 .inject 并且当我想使用该字段时它仍然为空。
我有这个class:
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;
}
}
据我在调用 inject(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 2 组件的创建是在 class 扩展 Android 的一个应用程序 class 中完成的。这样做主要是为了确保这些组件(以及它们所包含的依赖项)仅被实例化一次。 (有关详细信息,请参阅 Dagger 文档:https://google.github.io/dagger/users-guide)
虽然我没有看到任何说明您不能以不同方式连接它的内容,但我也没有找到它的示例。我想知道是否尝试使用您正在进行的 Initializer.init() 调用即时连接组件是否以某种方式绕过了 Dagger 正确设置组件以进行注入的能力。是否可以将组件 classes 的实例化重构为应用程序实现?
上面的代码看起来应该可以工作(除了通过每次 init() 调用而不是 Singleton 获取一个新的 DaggerApplicationComponent 实例之外),我无法真正解释为什么它不能工作。
你的注入方法
void inject(IApplication application);
需要改为
void inject(Application application);
请注意从 IApplication 到 Application 的变化。你不能为注入方法使用接口,你需要使用 class.