首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger2基础.场注入-不工作

Dagger2基础.场注入-不工作
EN

Stack Overflow用户
提问于 2017-02-07 11:38:28
回答 2查看 6.6K关注 0票数 3

我正在尝试使用Dagger2进行字段注入。我意识到我需要手动调用注入,以防方法注入。我主要是想给一辆汽车注入发动机。引擎在运行时决定,并注入。

数据是这样的

CarInterface

代码语言:javascript
复制
import dagger.Binds;

public interface Car {  

    public void run();
}

Car实施

代码语言:javascript
复制
public class Volkswagen implements Car {

@Inject
public Engine engine;

    public void run() {
        System.out.println("About to Run");
        engine.start();
    }
}

发动机接口

代码语言:javascript
复制
public interface Engine {
    public String start();
}

引擎实现

代码语言:javascript
复制
public class Ferrari4Cylinder implements Engine {

    @Override
    public String start() {
        return "Ignition----Vroom-- Vroom-- Sweet Purring Sound";
    }
}

汽车模块

代码语言:javascript
复制
public  class CarModule{
    @Provides @Singleton
    Car provideCar(){
        return new Volkswagen();
    }   
}

发动机模块

代码语言:javascript
复制
@Module
public class EngineModule {
    @Provides @Singleton
    public Engine provideEngine(){
        return new Ferrari4Cylinder();
    }
}

组件类

代码语言:javascript
复制
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
    public Car provideCar();
    void inject(Car car);
}

主要方法

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {
        MyCarComponent carComponent= DaggerMyCarComponent.builder().build();
        Car car = carComponent.provideCar();    
        carComponent.inject(car);
        car.run();
    }
}

出于某种原因: Car.run()方法总是返回null,因为引擎从未被注入。线程"main“java.lang.NullPointerException中的异常

有人能帮忙了解这里发生的事吗?

更新9/02/2016 :我发现以下更改组件指向实际实现工作如下所示。不知道为什么另一个没有,但它帮助我在这个问题上取得进展。

代码语言:javascript
复制
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
    public Volkswagen provideCar();
    void inject(Volkswagen car);
}

希望这能帮助人们解决Dagger的现场注射问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-08 01:10:25

您似乎忘了将EngineModule添加到MyCarComponent中。

为了进行字段注入,您应该在@Inject类中的Engine上添加Engine注释。但鼓励尽可能避免现场注射。相反,可以考虑这样做:

代码语言:javascript
复制
public class Volkswagen implements Car {

  private final Engine engine;

  public Volkswagen(Engine engine) {
    this.engine = engine;
  }

}

然后在CarModule

代码语言:javascript
复制
@Provides
@Singleton
static Car provideCar(Engine engine) {
  return new Volkswagen(engine);
}

而且,这样您就不需要组件接口上的inject方法了。

记住要将EngineModule添加到组件中,这样匕首就可以提供Engine

票数 0
EN

Stack Overflow用户

发布于 2017-02-08 16:50:14

您需要用@Inject对引擎字段进行注释。我还认为,您需要为您的注入方法提供已实现的类(大众汽车,而不仅仅是汽车)。

代码语言:javascript
复制
public class Volkswagen implements Car {

  @Inject public Engine engine;

  public void run() {
    System.out.println("About to Run");

    engine.start();
  }
}

--

代码语言:javascript
复制
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {

  public Car provideCar();
  void inject(Volkswagen car);

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42088929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档