Java 匕首2零场注入

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) { }

嗨,我读过其他的帖子,但我没法修复它。基本上,我的问题是调用.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();
        }
    }
}
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方法传递给
应用程序
,只是为了将相同的实例注入自身。这只是为了测试所有东西都连接好了吗?是的,应用程序部分只是为了测试注入方法。例如,我对路由器更感兴趣。。。但过程是一样的。是的,我意识到这就是问题所在。我在上一篇文章中对此进行了评论。谢谢