我正在尝试新的匕首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声明为变量。
我错过了什么吗?我一整天都努力让它发挥作用,但我没有成功。
感谢帮助。
答案 0 :(得分:16)
嗯......经过一整天的花费,我决定发布它,5分钟后我找到了解决方案。
我在我的所有活动中使用BaseActivity,我认为我可以使用它来注入我的组件但接缝这是不可能的。
所以我只是在ActivityComponent中改变这一行
public void inject(BaseActivity activity)
到
public void inject(MainActivity activity)
所以我要注入依赖项的活动名称......
是什么让我想到了一个新问题。如何实现基本组件来处理我的所有活动?或者我必须为每个想要DI的视图/活动/片段创建一个组件?
答案 1 :(得分:2)
@Marcel,我最近将一个项目从Dagger 1.2迁移到了2.0。我有类似的解决方案,其中抽象的BaseActivity通过执行" application.inject(this);"的行来注入依赖项。使用Dagger 2.0,如上面的评论所述,这是不可能的(截至目前)。
我解决这个问题的方法之一是改变"注入" Application类本身的方法强类型对象。例如..
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的项目也是这样做的。