我正在尝试新的匕首2,这是我第一次实施它,但我不能让它工作。 我想我得到了这个概念,我理解这里的例子

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

这是扩展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声明为变量。

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

感谢帮助。

#1楼 票数:16 已采纳

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

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

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

public void inject(BaseActivity activity) 

public void inject(MainActivity activity) 

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

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

#2楼 票数:2

@Marcel,我最近将一个项目从Dagger 1.2迁移到了2.0。 我有类似的解决方案,其中抽象的BaseActivity通过执行“application.inject(this);”的操作来注入依赖项。 使用Dagger 2.0,如上面的评论所述,这是不可能的(截至目前)。

我解决这个问题的方法之一是将Application类本身中的“inject”方法更改为强类型对象。 例如..

class MyApp extends Application {
   ...
   public void inject(Object activity) {
    if (activity instanceof MainActivity) {
      mComponent.inject((MainActivity) activity);
    } else if (activity instanceof SubActivity) {
      mComponent.inject((SubActivity) activity);
    }
  }
}

有了这个,我不需要改变现有课程中的任何内容。

仅供参考:@ thomas-broyer有一个名为Bullet的项目也是这样做的。

  ask by Marcel translate from so

未解决问题?本站智能推荐:

1回复

Dagger 2依赖注入不起作用

我是Dagger 2的新手,我试图通过一些小的修改来使这个基本示例生效。 这是我到目前为止的内容: 组件类 模块类别 静态喷油器 问题是我每次做 带注释的字段仍然为空。 我怀疑问题出在接口方法中的对象类型。 在示例中,有一个Activity代替。
1回复

为什么Dagger注入不起作用,但是component.getObject是

我正在尝试使用Dagger 2实例化Retrofit接口。 CloudContactDataStore类注入RestClient并调用其方法。 当我实例化CloudContactDataStore对象时,其RestClient属性具有null值。 这是我创建Dagger模块和组件
1回复

Dagger 2场注入在Android中不起作用

问题是我尝试将字段注入与Dagger 2一起使用,但是在运行时应该注入的字段始终为null 。 我也尝试使用MVVM模式。 这是我的代码: ProfileActivity.java: ProfileViewModel.java: UserRepository.java:
2回复

主持人注射Dagger 2

我刚刚开始使用Dagger 2,我在网上发现了数千个指南,每个指南都有不同的实现,现在我有点困惑。 所以基本上这就是我现在写的: AppModule.java: DataModule.java: PrefsModel.java: AppComponent.java
1回复

如何正确使用Dagger 2的LibGDX现场注射?

我在基于LibGDX的游戏中注入一些依赖项时遇到问题。 任何人都可以指出我错过了什么吗? 我有两个模块。 首先提供Android的Context : 第二个提供与Google Analytics互动的课程: 我的组件类以这种方式实现: 现在,我已经添加了自定
1回复

每个活动的Dagger 2自定义范围

我是否需要为每个活动创建每个范围? 我不能仅为片段的每个活动定义默认范围吗?
1回复

如何将当前要注入的活动传递给Dagger2中的对象

假设我有一个A定义的A类: 我有一个这样定义的活动: 如何为对象提供当前活动?
2回复

在Dagger 2中的活动中传递应用程序上下文(NullPointerException)

我试图在Dagger 2中传递Application context Activity。非常感谢您的帮助! 我在最后提供了Logcat控制台。 格雷戈里·基克(Gregory Kick)的项目给了我同样的问题,如下面的最后一个错误部分所示。 https://github.com/gk5