加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Dagger 2活动注入不起作用

发布时间:2020-12-15 05:18:10 所属栏目:Java 来源:网络整理
导读:我正在尝试新的匕首2,这是我第一次实施它,但我不能让它工作.我想我得到了这个概念,我理解了 here的例子 我尝试复制相同的结构只是为我的例子稍作修改. 这是扩展Graph的AppComponent,我定义了我想要的类. @ApplicationScope@Component(modules = {AppModule.c
我正在尝试新的匕首2,这是我第一次实施它,但我不能让它工作.我想我得到了这个概念,我理解了 here的例子

我尝试复制相同的结构只是为我的例子稍作修改.

这是扩展Graph的AppComponent,我定义了我想要的类.

@ApplicationScope
@Component(modules = {AppModule.class,DataModule.class})
public interface EFAppComponent extends EFGraph {

    /**
     * An initializer that creates the graph from an application.
     */
    public final static class Initializer {

        private Initializer() {
        } // No instances.

        public static EFAppComponent init(EFApp app) {
            return Dagger_EFAppComponent.builder()
                    .appModule(new AppModule(app))
                    .build();
        }
    }
}


public interface EFGraph {

    public void inject(EFApp app);

    public ImageLoader imageLoader();

    public EventBus eventBus();

}

然后在每个模块中我提供相应的类.从这里一切都很好,Dagger接缝正确构建Dagger_EFAppComponent.

然后在Application类中使用构造函数初始化

component = EFAppComponent.Initializer.init(this);
component.inject(this);

然后我的目标是在我的活动中注入ImageLoader和EventBus.为此,我创建了一个ActivityComponent.

@ActivityScope
@Component(
        dependencies = EFAppComponent.class,modules = ActivityModule.class
)
public interface ActivityComponent {

    public void inject(BaseActivity activity);

}

然后从我的活动我打电话给注入.

activityComponent = Dagger_ActivityComponent.builder()
                .eFAppComponent(component)
                .activityModule(new ActivityModule(this))
                .build();
activityComponent.inject(this);

因为我应该在注入注入方法之后在我的活动中声明@Inject EventBus eventBus.嗯,不是.

因此,在逐步调试和跟踪我的应用程序和示例后,我意识到Dagger_ActivityComponent未正确构建.

private final ActivityModule activityModule;
    private final EFAppComponent eFAppComponent;

    private Dagger_ActivityComponent(Builder builder) {  
        assert builder != null;
        this.activityModule = builder.activityModule;
        this.eFAppComponent = builder.eFAppComponent;
        initialize();
  }

如果initialize方法为空,并且没有将Provider声明为变量.

我错过了什么吗?我已经整整一天努力让它发挥作用,但我没有成功.

感谢帮助.

解决方法

嗯…在这一整天花费之后,我决定发布它,5分钟后我找到了解决方案.

我正在为我的所有活动使用BaseActivity,并且我认为我可以使用它来注入我的组件但接缝这是不可能的.

所以我只是在ActivityComponent中改变这一行

public void inject(BaseActivity activity)

public void inject(MainActivity activity)

所以我要注入依赖项的活动的名称…

是什么让我想到了一个新问题.如何实现基本组件来处理我的所有活动?或者我必须为每个想要DI的视图/活动/片段创建一个组件?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读