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