在Dagger中注入泛型

时间:2015-01-29 21:27:26

标签: android mvp dagger

Dagger有可能做以下事情:

public abstract class Presenter<T extends BaseView> {

    @Inject T mView;

    public void showLoadingIndicator() {
        mView.showLoading();
    }

}

(示例模块)

public class MyModule {
    private MyView mView; //extends BaseView

    public MyModule(MyView view) {
        mView = view;
    }

    @Provides
    public BaseView provideView() {
        return mView;
    }

}

然后使用上面的模块创建一个对象图并将视图注入演示者?

我的尝试没有奏效(通常会得到“未知类'T'”的错误)。我不确定我的配置是否错误或者这是否是不受支持的功能。

1 个答案:

答案 0 :(得分:3)

有一个简单/明显的解决方法来实现相同的功能,具体取决于代码的其余部分。

通过不使用字段注入初始化基本演示者的mView字段,您可以将其传递给构造函数,然后让模块提供它,如:

public abstract class Presenter<T extends BaseView> {
    private final T mView;

    public Presenter(T view) {
        mView = view;
    }

    public void showLoadingIndicator() {
        mView.showLoading();
    }
}

假设它像这样使用:

public class MainPresenter extends Presenter<MainActivity> {
    public MainPresenter(MainActivity view) {
        super(view);
    }
}

并且模块创建演示者并将视图传递给它:

@Module(injects = MainActivity.class)
public class MainModule {
    private final MainActivity mMainActivity;

    public MainModule(MainActivity mainActivity) {
        mMainActivity = mainActivity;
    }

    @Provides
    MainPresenter mainPresenter() {
        return new MainPresenter(mMainActivity);
    }
}

无论如何我更喜欢这个,因为我更喜欢构造函数注入而不是字段注入(除了Dagger不创建的对象,例如活动或片段级别,当然我们无法避免@Inject)。

code here