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.