在Dagger中注入泛型

loe*_*chg 6 mvp android dagger

在Dagger中是否可以执行以下操作:

public abstract class Presenter<T extends BaseView> {

    @Inject T mView;

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

}
Run Code Online (Sandbox Code Playgroud)

(示例模块)

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

G. *_*ard 4

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

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

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

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

    public void showLoadingIndicator() {
        mView.showLoading();
    }
}
Run Code Online (Sandbox Code Playgroud)

假设它是这样使用的:

public class MainPresenter extends Presenter<MainActivity> {
    public MainPresenter(MainActivity view) {
        super(view);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    @Provides
    MainPresenter mainPresenter() {
        return new MainPresenter(mMainActivity);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

代码在这里