Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Dagger2中提供视图?_Android_Dependency Injection_Dagger 2_Dagger - Fatal编程技术网

Android 如何在Dagger2中提供视图?

Android 如何在Dagger2中提供视图?,android,dependency-injection,dagger-2,dagger,Android,Dependency Injection,Dagger 2,Dagger,下面是活动,它仍然使用一个旧的DI模型,我正在尝试迁移到Dagger2(使用DaggerAndroid)。我想插入演示者,正如您所看到的,一个依赖项是“NewProjectDisplayer”,它是活动中的自定义视图 这是我想提供给演示者的“NewProjectDisplayer” 我有一个模块(AppModule),它提供全局依赖项,如ProjectService、LoginService等 下面是我遇到问题的新项目模块。与活动关联的一个依赖项是“NewProjectDisplayer”。

下面是活动,它仍然使用一个旧的DI模型,我正在尝试迁移到Dagger2(使用DaggerAndroid)。我想插入演示者,正如您所看到的,一个依赖项是“NewProjectDisplayer”,它是活动中的自定义视图

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

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

下面是我遇到问题的新项目模块。与活动关联的一个依赖项是“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”,以便创建和注入演示者?我正在使用dagger android。

只是解决了您的问题,但不确定您是否应该使用dagger提供视图

把你的模块改成这样

@Module
public class NewProjectActivityModule {

private View view;

public NewProjectActivityModule (View view) {
    this.view = view;
}

@Provides
NewProjectDisplayer provideNewProjectDisplayer(View view) {
    return view;
}

}
YourDaggerComponent.builder().newProjectActivityModule(new NewProjectActivityModule (yourViewInstance)).build();
然而,无论你在哪里创建匕首组件,你都需要做类似的事情

@Module
public class NewProjectActivityModule {

private View view;

public NewProjectActivityModule (View view) {
    this.view = view;
}

@Provides
NewProjectDisplayer provideNewProjectDisplayer(View view) {
    return view;
}

}
YourDaggerComponent.builder().newProjectActivityModule(new NewProjectActivityModule (yourViewInstance)).build();

否则它将在运行时崩溃。

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

这是针对旧匕首的,对吗?我正在尝试使用新的dagger android,你不需要构建组件,只需要使用AndroidInjection。Injection(这)是的,太糟糕了,我想我可以让活动实现相同的显示器界面并委托给compoundview,但这会产生非常难看的代码。我认为最简单的方法就是用片段替换所有视图。您还可以将视图的实例传递到构造函数之外。很多人使用
attach()
detach()
方法来实现这一点。是的,使用
attach(NewProjectDisplayer-displayer)
为我解决了问题,谢谢