Dagger 2 activity 注入无效
Dagger 2 activity injection not working
我正在尝试新的匕首 2,这是我第一次实现它,但我无法让它工作。我想我明白了这个概念,我理解了这个例子 here
我尝试复制相同的结构,只是为我的示例稍作修改。
这是扩展图形的 AppComponent,我在其中定义了我想要的 classes。
@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();
}
然后在每个模块中我提供相应的 classes。从这里一切正常,Dagger 接缝正确构建 Dagger_EFAppComponent。
然后在应用程序中 class 我使用构造函数初始化
component = EFAppComponent.Initializer.init(this);
component.inject(this);
然后我的目标是在我的 activity 中注入 ImageLoader 和 EventBus。为此,我创建了一个 ActivityComponent。
@ActivityScope
@Component(
dependencies = EFAppComponent.class,
modules = ActivityModule.class
)
public interface ActivityComponent {
public void inject(BaseActivity activity);
}
然后从我的 activity 我调用注入。
activityComponent = Dagger_ActivityComponent.builder()
.eFAppComponent(component)
.activityModule(new ActivityModule(this))
.build();
activityComponent.inject(this);
所以因为我在我的 activity 中声明了 @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();
}
如果初始化方法为空且没有 Provider 声明为变量。
我错过了什么吗?我一整天都在努力让它发挥作用,但我没有成功。
感谢帮助。
好吧...在花了一整天时间后,我决定 post 它,5 分钟后我找到了解决方案。
我正在为我的所有 activity 使用 BaseActivity,我想我可以用它来注入我的组件,但接缝这是不可能的。
所以我只是在 ActivityComponent 中更改这一行
public void inject(BaseActivity activity)
至
public void inject(MainActivity activity)
所以我要注入依赖项的 activity 的名称...
是什么让我想到了一个新问题。我怎样才能实现一个基本组件来处理我的所有活动?或者我必须为每个 view/activity/fragment 我想要 DI?
创建一个组件
@Marcel,我最近将一个项目从 Dagger 1.2 迁移到了 2.0。我有类似的解决方案,其中抽象 BaseActivity 通过按照 "application.inject(this);" 的方式执行某些操作来注入依赖项。使用 Dagger 2.0,如上面的评论所述,这是不可能的(截至目前)。
我解决这个问题的方法之一是将应用程序 class 本身中的 "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);
}
}
}
有了它,我不必更改现有 classes 中的任何内容。
仅供参考:@thomas-broyer 有一个名为 Bullet 的项目也是这样做的。
我正在尝试新的匕首 2,这是我第一次实现它,但我无法让它工作。我想我明白了这个概念,我理解了这个例子 here
我尝试复制相同的结构,只是为我的示例稍作修改。
这是扩展图形的 AppComponent,我在其中定义了我想要的 classes。
@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();
}
然后在每个模块中我提供相应的 classes。从这里一切正常,Dagger 接缝正确构建 Dagger_EFAppComponent。
然后在应用程序中 class 我使用构造函数初始化
component = EFAppComponent.Initializer.init(this);
component.inject(this);
然后我的目标是在我的 activity 中注入 ImageLoader 和 EventBus。为此,我创建了一个 ActivityComponent。
@ActivityScope
@Component(
dependencies = EFAppComponent.class,
modules = ActivityModule.class
)
public interface ActivityComponent {
public void inject(BaseActivity activity);
}
然后从我的 activity 我调用注入。
activityComponent = Dagger_ActivityComponent.builder()
.eFAppComponent(component)
.activityModule(new ActivityModule(this))
.build();
activityComponent.inject(this);
所以因为我在我的 activity 中声明了 @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();
}
如果初始化方法为空且没有 Provider 声明为变量。
我错过了什么吗?我一整天都在努力让它发挥作用,但我没有成功。
感谢帮助。
好吧...在花了一整天时间后,我决定 post 它,5 分钟后我找到了解决方案。
我正在为我的所有 activity 使用 BaseActivity,我想我可以用它来注入我的组件,但接缝这是不可能的。
所以我只是在 ActivityComponent 中更改这一行
public void inject(BaseActivity activity)
至
public void inject(MainActivity activity)
所以我要注入依赖项的 activity 的名称...
是什么让我想到了一个新问题。我怎样才能实现一个基本组件来处理我的所有活动?或者我必须为每个 view/activity/fragment 我想要 DI?
创建一个组件@Marcel,我最近将一个项目从 Dagger 1.2 迁移到了 2.0。我有类似的解决方案,其中抽象 BaseActivity 通过按照 "application.inject(this);" 的方式执行某些操作来注入依赖项。使用 Dagger 2.0,如上面的评论所述,这是不可能的(截至目前)。
我解决这个问题的方法之一是将应用程序 class 本身中的 "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);
}
}
}
有了它,我不必更改现有 classes 中的任何内容。
仅供参考:@thomas-broyer 有一个名为 Bullet 的项目也是这样做的。