android - 无法使用 Dagger 2 注入(inject)类

标签 android dagger-2

我正在尝试将 Dagger 2 添加到我的 Android 项目中。我想我已经理解了构建图表的概念。那时我在黑暗中拍摄,这就是我出错的地方。
一切都可以编译,但注入(inject)的字段在运行时为空。

我试图通过将 Presenter 注入(inject)我的 MainActivity 来开始。我已经编写了以下代码,如果您能帮助我找出哪里出错了,我将不胜感激。

我的 PresenterModule.java:

@Module
public class PresenterModule {

  @Provides MainActivityPresenter providesMainActivityPresenter() {
    return new DefaultMainActivityPresenter();
  }
}

我的应用程序类还包括我的组件,遵循 Dagger2 示例代码:

public class App extends Application {

  private PresenterComponent component;

  @Singleton
  @Component(modules = PresenterModule.class)
  public interface PresenterComponent {
    void inject(App app);
    void inject(MainActivity activity);
  }


  @Override public void onCreate() {
    Log.d("App.java", "Starting Application");
    super.onCreate();

    component = DaggerApp_PresenterComponent.builder()
        .presenterModule(new PresenterModule())
        .build();
    component.inject(this);
  }

  public PresenterComponent component() {
    return component;
  }
}

最后是我的 MainActivity。

public class DefaultMainActivity
    extends ActionBarActivity
    implements MainActivity
{
  @Inject MainActivityPresenter mPresenter;

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ((App)getApplication()).component().inject(this);

    mPresenter.getCurrentDetailLineNumber();
    setContentView(R.layout.base_layout);

    getSupportActionBar();

    mContainer = (Container) findViewById(R.id.container);
    mPresenter.requestCurrentScreen();
  }

要注入(inject)的实际对象是接口(interface)的实现,但在其他方面是 POJO 对象:

public class DefaultMainActivityPresenter implements MainActivityPresenter {

  private static final int SCREEN_BROWSER = 0;
  private static final int SCREEN_DETAIL = 1;

  LineNumber mCurrentDetailLineNumber;
  int mCurrentScreen;

  @Inject
  public DefaultMainActivityPresenter() {
  }
  ...
}

最佳答案

将 PresenterComponent 更改为以下将解决您的问题:

  @Singleton
  @Component(modules = PresenterModule.class)
  public interface PresenterComponent {
    void inject(App app);
    void inject(DefaultMainActivity activity);
  }

这是由于协方差: 虽然类型的成员注入(inject)方法将接受其子类型的实例,但只会注入(inject)参数类型及其父类(super class)型的注入(inject)注释成员;子类型的成员不会。例如,给定以下类型,当传递给成员注入(inject)方法 injectSelf(Self instance) 时,只有 a 和 b 会被注入(inject)到 Child 的实例中:

   class Parent {
     @Inject A a;
   }

   class Self extends Parent {
     @Inject B b;
   }

   class Child extends Self {
     @Inject C c;
   }

关于android - 无法使用 Dagger 2 注入(inject)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884007/

相关文章:

android - Android 中的 onTouchListener 将检测所有父 View 上的触摸

java - 注释或一些自动代码生成来设置默认值以避免 Android/Java 中的 NullPointerExceptions?

java - SonarQube:无法读取 7.1.1-coverage.ec 以确定 JaCoCo 二进制格式

java - 从异步线程访问Android Activity 堆栈?

java - Dagger 2 Activity 注入(inject)不起作用

java - Dagger2 组件通用注入(inject)方法

android - Dagger 2 引发 Component.Builder : @Component. Builder 缺少所需模块或组件的 setter 错误:

java - 仅将 Dagger 2 的依赖项注入(inject)到其中一种产品风格中

android - 我的应用程序安装后回调?

android - 如何让 Dagger2 编译器选项工作?