2017-12-02 337 views
0

下面是活动,它仍然使用旧的DI模型,我试图迁移到Dagger2(使用Dagger-android)。我想注入Presenter,正如你所看到的,一个依赖是'NewProjectDisplayer',它是活动中的自定义视图。如何在Dagger2中提供视图?

enter image description here

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

enter image description here

我有一个模块(的AppModule),其提供像ProjectService全局相关性,login服务等

下面是我遇到麻烦的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”,使演示者可以创建和注入?我正在使用匕首 - 机器人。

回答

0

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

+0

是啊,这很糟糕,我想我可以使活动实现相同的显示器界面和委托给复合视图,但这会创建非常丑陋的代码。我认为最简单的事情就是用碎片替换所有视图 – Linxy

+0

您也可以在构造函数之外传递视图的实例。许多人用'attach()'和'detach()'方法做这件事。 – mcassiano

+0

是啊,使用'附加(NewProjectDisplayer显示器)..'为我工作,谢谢 – Linxy

0

只是解决你的问题,不知道你是否应该提供与匕首的意见,虽然。

改变你的模块是这样的。

@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(); 

否则它会在运行时崩溃。

+0

这是给老匕首吧?我试图使用新的匕首android和那里你不建立组件,而只是使用AndroidInjection.inject(this) – Linxy

相关问题