Java 匕首2零场注入
嗨,我读过其他的帖子,但我没法修复它。基本上,我的问题是调用.inject,当我想使用这个字段时,它仍然是空的 我有这门课:Java 匕首2零场注入,java,libgdx,dagger-2,dagger,Java,Libgdx,Dagger 2,Dagger,嗨,我读过其他的帖子,但我没法修复它。基本上,我的问题是调用.inject,当我想使用这个字段时,它仍然是空的 我有这门课: public class Application extends Game implements IApplication { @Inject IApplication app; @Inject IRouter router; public Application(IPlatformCode platformCode) { }
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();
}
}
}
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;
}
}
}
这是模块:
@Module
public class ApplicationModule {
private IApplication app;
public ApplicationModule(IApplication app) {
this.app = app;
}
@Provides
@Singleton
public IApplication providesApplication(){
return app;
}
}
据我所知,在调用inject(IAApplication)后,@inject IAApplication应该被注入,并且有一个值,但现在它是null
生成的代码如下所示:
@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();
}
}
}
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;
}
}
}
公共最终类DaggerApplicationComponent实现ApplicationComponent{
私人提供商提供应用程序提供商;
专用DaggerApplicationComponent(DaggerApplicationComponent.Builder){
断言生成器!=null;
初始化(生成器);
}
公共静态DaggerApplicationComponent.Builder(){
返回新的DaggerApplicationComponent.Builder();
}
私有void初始化(DaggerApplicationComponent.Builder){
this.providesApplicationProvider=DoubleCheck.provider(ApplicationModule\u ProvidesApplicationFactory.create(builder.ApplicationModule));
}
公共无效注入(IApplication应用程序){
MembersInjectors.noOp().injectMembers(应用程序);
}
公共iaapplication getApplication(){
返回(IAApplication)this.ProvideApplicationProvider.get();
}
公共静态最终类生成器{
私有应用程序模块应用程序模块;
私人建筑商(){
}
公共应用程序组件生成(){
if(this.applicationModule==null){
抛出新的IllegalStateException(必须设置ApplicationModule.class.getCanonicalName()+);
}否则{
返回新的DaggerApplicationComponent(此);
}
}
公共DaggerApplicationComponent.Builder应用程序模块(应用程序模块应用程序模块){
this.applicationModule=(applicationModule)前置条件.checkNotNull(applicationModule);
归还这个;
}
}
}
提前感谢。通常,Dagger 2组件的创建是在一个扩展Android应用程序类的类中完成的。这主要是为了确保这些组件(以及它们所包含的依赖项)只实例化一次。(有关更多详细信息,请参阅Dagger文档:) 虽然我没有看到任何东西说你不能以不同的方式连接,但我也没有找到一个这样的例子。我想知道,如果试图用Initializer.init()调用动态连接组件,是否会绕过Dagger正确设置要注入的组件的功能。是否可以将组件类的实例化重构为应用程序实现 上面的代码看起来应该可以工作(除了通过每次init()调用而不是单例调用获得一个新的DaggerApplicationComponent实例之外),我无法解释为什么它不能工作。您的inject方法
void inject(IApplication application);
需要换成
void inject(Application application);
请注意从IApplication到just Application的更改。你不能使用接口来注入方法,你需要使用一个类。问题是我想在那里初始化路由器,以及所有其他模块,但我需要在那里使用它来转到另一个页面。这就是我为什么这样做的原因。在其他任何地方,我都会很好地使用构造函数注入。最后,initDagger应该只从create()调用一次,这是入口点,以后不再调用。我不明白为什么我要实例化各种DaggerApplicationComponentSide注意,这是LibGDX和Android.onCreate调用Application.create。问题是我使用的是接口。例如,IRouter应该从模块返回新路由器(),但它没有返回。显然dagger并没有赋予这个权利。我切换到类而不是接口,这很有效。有什么方法可以使用实例吗?我喜欢这样做,以防万一我更改了实现,我可以只更改模块中的实例化,但在其他任何地方都可以,因为它需要一个IRouter。
app
真的被注入了吗?是否正确生成了DaggerApplicationComponent
和DaggerOuterComponent
?ApplicationComponent
是否真的从ApplicationModule
提供了app
?我确实构建了项目,因此应该正确构建DaggerApplicationComponent。我正在将生成的代码添加到帖子中,以防它有所帮助。RouterComponent
是否应该是ApplicationComponent
的子组件?我想您可能只有一个@Singleton
组件。另一件我不清楚的事情是,您似乎将应用程序组件
的init方法传递给应用程序
,只是为了将相同的实例注入自身。这只是为了测试所有东西都连接好了吗?是的,应用程序部分只是为了测试注入方法。例如,我对路由器更感兴趣。。。但过程是一样的。是的,我意识到这就是问题所在。我在上一篇文章中对此进行了评论。谢谢