【问题标题】:How to Provide a View in Dagger2?如何在 Dagger2 中提供视图?
【发布时间】:2017-12-02 21:54:47
【问题描述】:

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

这是我要提供给演示者的“NewProjectDisplayer”

我有一个模块 (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。

【问题讨论】:

    标签: android dependency-injection dagger-2 dagger


    【解决方案1】:

    您不能在与dagger-android 兼容的活动模块上提供或执行findViewById,原因之一是该模块是在视图实际位于层次结构之前创建的。此外,这样做不是一个好习惯,但如果您仍然确信应该这样做,您可以尝试创建一个子组件,该组件将具有一个提供视图依赖项的模块,并且必须在 setContentView 之后创建它,正如@elmorabea 所建议的那样。

    【讨论】:

    • 是的,这很糟糕,我想我可以让活动实现相同的显示界面并委托给复合视图,但这会创建非常丑陋的代码。我认为最简单的方法就是用 Fragments 替换所有视图
    • 您也可以在构造函数之外传递视图的实例。许多人使用attach()detach() 方法来做到这一点。
    • 是的,使用attach(NewProjectDisplayer displayer).. 对我有用,谢谢
    【解决方案2】:

    只是解决您的问题,但不确定您是否应该使用 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 并且您不构建组件,而只需使用 AndroidInjection.inject(this)
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多