【发布时间】:2017-06-24 15:25:46
【问题描述】:
我正在尝试使用 Dagger2 进行字段注入。我意识到在方法注入的情况下我需要手动调用注入。我主要是尝试为汽车注入引擎。引擎在运行时决定并注入。
数据是这样的
汽车接口
import dagger.Binds;
public interface Car {
public void run();
}
汽车实施
public class Volkswagen implements Car {
@Inject
public Engine engine;
public void run() {
System.out.println("About to Run");
engine.start();
}
}
引擎接口
public interface Engine {
public String start();
}
引擎实现
public class Ferrari4Cylinder implements Engine {
@Override
public String start() {
return "Ignition----Vroom-- Vroom-- Sweet Purring Sound";
}
}
汽车模块
public class CarModule{
@Provides @Singleton
Car provideCar(){
return new Volkswagen();
}
}
引擎模块
@Module
public class EngineModule {
@Provides @Singleton
public Engine provideEngine(){
return new Ferrari4Cylinder();
}
}
组件类
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
public Car provideCar();
void inject(Car car);
}
主要方法
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,因为引擎永远不会被注入。 线程“主”java.lang.NullPointerException 中的异常
有人可以帮忙看看这里发生了什么吗?
2016 年 9 月 2 日更新: 我发现以下将组件更改为指向实际实现的工作如下所示。不知道为什么另一个没有,但它帮助我在这个问题上取得了进展。
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
public Volkswagen provideCar();
void inject(Volkswagen car);
}
希望这对尝试解决 Dagger 中的字段注入问题的人们有所帮助。
【问题讨论】:
-
如果 CAR 接口不存在,此代码可以正常工作。我遇到了错误还是缺少符号?
-
我仍然无法理解为什么它不起作用。我像您一样制作了虚拟项目,并且现场注入在该项目中不起作用。我进行了您在上次 cmets 中建议的更改,将其更改为大众汽车,但我仍然无法成功运行该项目。它仍然给出空指针异常。
-
你能解决这个问题吗?如果你能把代码发给我,我可以看看?