Dagger 2 Null野外注射

时间:2017-02-28 17:55:47

标签: java libgdx dagger-2 dagger

您好我已阅读其他帖子,但我无法修复它。基本上我的问题是我调用.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;
        }
    }
}

提前致谢。

2 个答案:

答案 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实例之外),我无法解释它为什么没有。