如何在 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 所建议的那样。