【问题标题】:Injecting Generics in Dagger在 Dagger 中注入泛型
【发布时间】:2015-01-29 21:27:25
【问题描述】:

是否可以在 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;
    }

}

然后用上面的模块创建一个对象图并将视图注入到presenter中?

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

【问题讨论】:

标签: android mvp dagger


【解决方案1】:

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

通过不使用字段注入来初始化基本演示者的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多