如何在android中的MVP层之间使用注入?

时间:2016-09-22 10:54:45

标签: java android dependency-injection mvp dagger-2

我最近在我的项目中使用 dagger 2

问题是当我尝试构建我的项目时,我的登录中的演示者 如下注入的活动为空

当我尝试构建项目时

如果没有@Inject构造函数或@ Provide-或@ Produces-annotated方法,则无法提供

演示者...

我不明白我做错了什么?,请有人帮我这个,

提前感谢。

这是我的登录活动,此处的演示者为空,这表明我没有正确注入

@Inject
LoginPresenter presenter;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    InjectHelper.getRootComponent().injectPresenter(this);
    presenter.setProgressBarVisiblity(View.INVISIBLE);
}

这是我的演示者模块

 @Module
 public class PresenterModule {
 private final LoginActivity activity;

public PresenterModule(LoginActivity activity) {
    this.activity = activity;
}

@Provides
@Singleton
public LoginActivity providesView() {

    return activity;
}
}


@Provides
@Singleton
public LoginPresenter providesPresenter()
{
    return new LoginPresenter();
}
}

这个注入助手类

public class InjectHelper {
  private static RootComponent sRootComponent;

static {
    initModules();
}

private static void initModules() {
    sRootComponent = getRootComponentBuilder().build();
}

public static DaggerRootComponent.Builder getRootComponentBuilder() {
    return DaggerRootComponent.builder();
}

public static RootComponent getRootComponent() {
    if (sRootComponent == null) {
        initModules();
    }
    return sRootComponent;
}

}

这是根组件类

@Singleton
@Component(modules = {
     PresenterModule.class
})
public interface RootComponent {
void injectLoginView(LoginPresenter loginPresenter);
}

2 个答案:

答案 0 :(得分:1)

您需要在组件中告知匕首哪些视图要使用注入。 您必须将组件中的注入功能代码更改为:

Windows Service

为了显示你想要的匕首,你需要使用@dagger注释,而不是在组件文件中将其作为注入函数发送。正如你做的那样:

    void inject(LoginActivity activity);

Dagger将在您的模块中搜索LoginPresenter类型的变量,并使用该类型找到正确的提供者方法。

你在组件中放入的内容作为"注入"函数告诉Dagger你要注射什么视图(不是你要注射的东西)

答案 1 :(得分:0)

@Singleton
@Component(modules = {PresenterModule.class})
public interface RootComponent {
    void inject(LoginActivity activity);
}