Java 匕首2活动注射不工作
我正在尝试新的匕首2,这是我第一次实现它,但我无法使它工作。我想我理解了这个概念,也理解了这个例子 我尝试复制相同的结构,只是对我的示例稍加修改 下面是AppComponent,它扩展了我定义所需类的图形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
@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);
}
}
}