Java 匕首2活动注射不工作

Java 匕首2活动注射不工作,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我正在尝试新的匕首2,这是我第一次实现它,但我无法使它工作。我想我理解了这个概念,也理解了这个例子 我尝试复制相同的结构,只是对我的示例稍加修改 下面是AppComponent,它扩展了我定义所需类的图形 @ApplicationScope @Component(modules = {AppModule.class, DataModule.class}) public interface EFAppComponent extends EFGraph { /** * An in

我正在尝试新的匕首2,这是我第一次实现它,但我无法使它工作。我想我理解了这个概念,也理解了这个例子

我尝试复制相同的结构,只是对我的示例稍加修改

下面是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();

}
然后在每个模块中,我提供了相应的类。从这里开始,一切都很好,匕首接缝可以正确构建匕首组件

然后在应用程序类I init中使用构造函数

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方法为空,并且没有提供程序声明为变量

我错过什么了吗?我花了一整天的时间试图让它工作,但我没有成功


感谢您的帮助。

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

我的所有活动都使用BaseActivity,我想我可以使用它来注入组件,但这是不可能的

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

public void inject(BaseActivity activity) 

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


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

@Marcel,我最近将一个项目从Dagger 1.2迁移到了2.0。我有类似的解决方案,其中AbstractBaseActivity通过按照“application.inject(this);”的方式注入依赖项。对于Dagger2.0,这是不可能的(到目前为止),如上面的评论所述

我解决这个问题的方法之一是将应用程序类本身中的“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的一个项目也可以这样做。

我认为你应该创建另一个问题,或者修改现有的问题。我将创建一个新的问题,因此,如果人们面临相同的问题,这里有一个解决方案,他可以在同一组件上使用第二种方法
public void inject(SecondActivity活动)
。这是由于dagger提供的静态类型。谢谢,这也很有用。您只能在当前所在的给定类中注入带注释的依赖项。如果
BaseActivity
具有
@Inject
注释的依赖项,则如果调用
Inject(BaseActivity)
,这些依赖项将被注入。但是您需要调用
inject(mainActivity)
来注入
mainActivity
中指定的依赖项。如何获取mComponent的实例
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);
    }
  }
}