如何在 Dagger2 中提供视图?
How to Provide a View in Dagger2?
下面是 Activity,它仍在使用旧的 DI 模型,我正在尝试迁移到 Dagger2(使用 dagger-android)。我想注入 Presenter,如您所见,一个依赖项是 'NewProjectDisplayer',它是 activity.
中的自定义视图
这是我要提供给演示者的'NewProjectDisplayer'
我有一个模块 (AppModule),它提供全局依赖项,如 ProjectService、LoginService 等。
下面是我遇到问题的 NewProjectModule。与 activity 相关联的依赖项之一是 'NewProjectDisplayer'。而且我不知道如何提供它..
@Module
public class NewProjectActivityModule {
@Provides
NewProjectDisplayer provideNewProjectDisplayer(View view) {
// ??? return view.findViewById(R.id.create_project_view);
}
@Provides
NewProjectNavigator provideNewProjectNavigator(BaseActivity baseActivity) {
return new AndroidNewProjectNavigator(baseActivity);
}
@Provides
NewProjectPresenter provideNewProjectPresenter(NewProjectDisplayer displayer, //
ProjectService projectService,
LoginService loginService,
UserService userService,
NewProjectNavigator navigator, //
PermissionHandler permissionHandler,//
CropImageHandler cropImageHandler,//
RxSchedulers schedulers) {
return new NewProjectPresenter(displayer, projectService, loginService,
userService, navigator, permissionHandler, cropImageHandler, schedulers);
}
}
我如何提供这个 'NewProjectDisplayer' 以便可以创建和注入 Presenter?我正在使用匕首-android.
只是解决你的问题,但不确定你是否应该使用 Dagger 提供视图。
将您的模块改成那样。
@Module
public class NewProjectActivityModule {
private View view;
public NewProjectActivityModule (View view) {
this.view = view;
}
@Provides
NewProjectDisplayer provideNewProjectDisplayer(View view) {
return view;
}
}
但是,无论您在哪里创建 Dagger 组件,都需要执行类似的操作。
YourDaggerComponent.builder().newProjectActivityModule(new NewProjectActivityModule (yourViewInstance)).build();
否则它将在 运行 时崩溃。
您不能在与 dagger-android
兼容的 activity 模块上提供或执行 findViewById
,原因之一是模块是在视图实际打开之前创建的层次结构。此外,这样做不是一个好的做法,但如果您仍然确信应该这样做,您可以尝试创建一个子组件,该组件将具有一个提供视图依赖项的模块,并且必须在 [=12 之后创建=],正如@elmorabea 所建议的那样。
下面是 Activity,它仍在使用旧的 DI 模型,我正在尝试迁移到 Dagger2(使用 dagger-android)。我想注入 Presenter,如您所见,一个依赖项是 'NewProjectDisplayer',它是 activity.
中的自定义视图这是我要提供给演示者的'NewProjectDisplayer'
我有一个模块 (AppModule),它提供全局依赖项,如 ProjectService、LoginService 等。
下面是我遇到问题的 NewProjectModule。与 activity 相关联的依赖项之一是 'NewProjectDisplayer'。而且我不知道如何提供它..
@Module
public class NewProjectActivityModule {
@Provides
NewProjectDisplayer provideNewProjectDisplayer(View view) {
// ??? return view.findViewById(R.id.create_project_view);
}
@Provides
NewProjectNavigator provideNewProjectNavigator(BaseActivity baseActivity) {
return new AndroidNewProjectNavigator(baseActivity);
}
@Provides
NewProjectPresenter provideNewProjectPresenter(NewProjectDisplayer displayer, //
ProjectService projectService,
LoginService loginService,
UserService userService,
NewProjectNavigator navigator, //
PermissionHandler permissionHandler,//
CropImageHandler cropImageHandler,//
RxSchedulers schedulers) {
return new NewProjectPresenter(displayer, projectService, loginService,
userService, navigator, permissionHandler, cropImageHandler, schedulers);
}
}
我如何提供这个 'NewProjectDisplayer' 以便可以创建和注入 Presenter?我正在使用匕首-android.
只是解决你的问题,但不确定你是否应该使用 Dagger 提供视图。
将您的模块改成那样。
@Module
public class NewProjectActivityModule {
private View view;
public NewProjectActivityModule (View view) {
this.view = view;
}
@Provides
NewProjectDisplayer provideNewProjectDisplayer(View view) {
return view;
}
}
但是,无论您在哪里创建 Dagger 组件,都需要执行类似的操作。
YourDaggerComponent.builder().newProjectActivityModule(new NewProjectActivityModule (yourViewInstance)).build();
否则它将在 运行 时崩溃。
您不能在与 dagger-android
兼容的 activity 模块上提供或执行 findViewById
,原因之一是模块是在视图实际打开之前创建的层次结构。此外,这样做不是一个好的做法,但如果您仍然确信应该这样做,您可以尝试创建一个子组件,该组件将具有一个提供视图依赖项的模块,并且必须在 [=12 之后创建=],正如@elmorabea 所建议的那样。