Kotlin Dagger2 主构造函数出错



>我正在尝试学习dagger 2,尝试将基本的 java 示例转换为 kotlin,但由于我收到以下错误而无法这样做......

错误:dagger不支持注入到私有字段 私有通信示例引擎;

这是工作正常的Java代码,

public class Car {
private Engine engine;
private Wheel wheel;
@Inject
public Car(Engine engine, Wheel wheel) {
this.engine = engine;
this.wheel = wheel;
}
}

汽车.java类具有 2 个依赖项。

public class Engine {
@Inject
Engine(){}
}
public class Wheel {
@Inject
Wheel(){}
}

这是我的 kotlin 代码:-

class Car(@Inject  var engine: Engine, @Inject  val wheels: Wheels) {
fun drive(){
Log.d("CAR","<<<<<< DRIVING >>>>>")
}
}
class Engine @Inject constructor() {}
class Wheels @Inject constructor() {}
@Component
interface CarComponent {
fun getCar() : Car
}

这是生成的代码

public final class Car {
@org.jetbrains.annotations.NotNull()
@javax.inject.Inject()
private com.toi.roboelectric.Engine engine;
@org.jetbrains.annotations.NotNull()
@javax.inject.Inject()
private final com.toi.roboelectric.Wheels wheels = null;
public final void drive() {
}
@org.jetbrains.annotations.NotNull()
public final com.toi.roboelectric.Engine getEngine() {
return null;
}
public final void setEngine(@org.jetbrains.annotations.NotNull()
com.toi.roboelectric.Engine p0) {
}
@org.jetbrains.annotations.NotNull()
public final com.toi.roboelectric.Wheels getWheels() {
return null;
}
public Car(@org.jetbrains.annotations.NotNull()
com.toi.roboelectric.Engine engine, @org.jetbrains.annotations.NotNull()
com.toi.roboelectric.Wheels wheels) {
super();
}
}

请将汽车类更新为

class Car @Inject constructor(var engine: Engine,val wheels: Wheels) {
fun drive(){
Log.d("CAR","<<<<<< DRIVING >>>>>")
}

这个问题是关于如何在 Dagger 2 中将数据注入对象。在 Dagger 2 中有两种方法可以做到这一点。一个是通过类的构造函数注入,另一个是直接注入类的字段。

在 Java 实现中,注入的是构造函数声明中的变量,而不是 car 对象的属性。注入过程与类的属性无关。通过使用注入的数据来设置类的属性。无论属性是私有的还是公共的,设置过程始终可以完成,因为您在类对象的内部工作。

在将 Kotlin 类定义为:

class Car(@Inject  var engine: Engine, @Inject  val wheels: Wheels)

如果我们检查这个 Kotlin 实现的 java 代码,我们可以看到这次构造函数除了super((之外什么也没做

public Car(@org.jetbrains.annotations.NotNull()
com.toi.roboelectric.Engine engine, @org.jetbrains.annotations.NotNull()
com.toi.roboelectric.Wheels wheels) {
super();
}

这次,注射程序是现场直接注射程序。在这种情况下,Dagger 将生成喷油器类MembersInjector来注入发动机车轮。若要使注入器类能够设置属性,该属性必须是公共的。成员注射器将如下所示:

public final class Car_MembersInjector implements MembersInjector<Car> {
private final Provider<Engine> engineProvider;
private final Provider<Wheel> wheelProvider;
public Car_MembersInjector(Provider<Engine> engineProvider, Provider<Wheel> wheelProvider) {
this.engineProvider = engineProvider;
this.wheelProvider = wheelProvider;
}
public static MembersInjector<Car> create(Provider<Engine> engineProvider,
Provider<Wheel> wheelProvider) {
return new Car_MembersInjector(engineProvider, wheelProvider);
}
@InjectedFieldSignature("com.freddie.daggerkotlin.Car.engine")
public static void injectEngine(Car instance, Engine engine) {
instance.engine = engine;
}
@InjectedFieldSignature("com.freddie.daggerkotlin.Car.wheel")
public static void injectWheel(Car instance, Wheel wheel) {
instance.wheel = wheel;
}
@Override
public void injectMembers(Car instance) {
injectEngine(instance, engineProvider.get());
injectWheel(instance, wheelProvider.get());
}
}

此问题有两种解决方案:

1.构造函数注入。将 Kotlin 类定义为:

class Car @Inject constructor(var engine: Engine, var wheel: Wheel)

class Car @Inject constructor(var engine: Engine, var wheel: Wheel)

2.现场注入。将 Kotlin 类定义为:

class Car @Inject constructor()
{
@Inject lateinit var engine: Engine
@Inject lateinit var wheel: Wheel
}

如果希望引擎和轮子是私有的,则 Just 和私有修饰符:

class Car @Inject constructor ()
{
private lateinit var engine: Engine
private lateinit var wheel: Wheel
}

相关内容

最新更新