如何在Dagger2中提供视图?

时间:2017-12-02 21:54:48

标签: android dependency-injection dagger-2 dagger

下面是Activity,它仍在使用旧的DI模型,我正在尝试迁移到Dagger2(使用dagger-android)。我想注入Presenter,正如您所看到的,一个依赖项是' NewProjectDisplayer'这是活动中的自定义视图。

enter image description here

这是' NewProjectDisplayer'我想提供给演示者

enter image description here

我有一个模块(AppModule),它提供了像ProjectService,LoginService等全局依赖项。

以下是我遇到问题的NewProjectModule。与活动相关的依赖项之一是“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吗?我正在使用dagger-android。

2 个答案:

答案 0 :(得分:1)

您无法在与00007ff9611e12c0 990 63360 System.Web.HttpAsyncResult 00007ff9611e0348 166 70384 System.Web.HttpContext 00007ff9611e08f8 166 65072 System.Web.HttpRequest 兼容的活动模块上提供或执行findViewById,原因之一是模块是在视图实际位于层次结构之前创建的。此外,这样做不是一个好习惯,但是如果你仍然相信你应该这样做,你可以尝试创建一个子组件,它将具有一个提供视图依赖的模块,并且必须在{{1如@elmorabea所建议的那样。

答案 1 :(得分:0)

只是解决你的问题,不确定你是否应该提供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();

否则它会在运行时崩溃。