Android 主构造函数出现Kotlin Dagger2错误
我正在尝试我的手学习匕首2,试图将基本java示例转换为kotlin,但由于以下错误而无法实现 错误:Dagger不支持注入到私有字段 私有com.example.Engine强> 下面是运行良好的Java代码Android 主构造函数出现Kotlin Dagger2错误,android,kotlin,dependency-injection,dagger-2,Android,Kotlin,Dependency Injection,Dagger 2,我正在尝试我的手学习匕首2,试图将基本java示例转换为kotlin,但由于以下错误而无法实现 错误:Dagger不支持注入到私有字段 私有com.example.Engine 下面是运行良好的Java代码 public class Car { private Engine engine; private Wheel wheel; @Inject public Car(Engine engine, Wheel wheel) { this.eng
public class Car {
private Engine engine;
private Wheel wheel;
@Inject
public Car(Engine engine, Wheel wheel) {
this.engine = engine;
this.wheel = wheel;
}
}
具有2个依赖项的Car.java类
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
}
请将汽车等级更新为
class Car @Inject constructor(var engine: Engine,val wheels: Wheels) {
fun drive(){
Log.d("CAR","<<<<<< DRIVING >>>>>")
}
class Car@injectconstructor(变量引擎:引擎,变量轮子:轮子){
趣味驾驶{
Log.d(“汽车”,“汽车”)
}
这个问题是关于如何在Dagger 2中向对象注入数据。在Dagger 2中有两种方法可以做到这一点。一种是通过类的构造函数注入,另一种是直接注入类的字段
在Java实现中,您注入的是构造函数声明中的变量,而不是car对象的属性。注入过程与类的属性无关。您可以使用注入的数据设置类的属性。无论属性是私有的还是公共的,设置过程都可以完成,因为您在类对象的内侧工作
将Kotlin类定义为:
class Car(@Inject var engine: Engine, @Inject val wheels: Wheels)
class Car @Inject constructor()
{
@Inject lateinit var engine: Engine
@Inject lateinit var wheel: Wheel
}
如果我们检查这个Kotlin实现的java代码,我们可以看到这次构造函数除了super()
这一次,喷射程序是一个现场直接喷射程序。在这种情况下,Dagger将生成injector classMembersInjector,以喷射发动机和车轮。要启用injector class设置属性,属性必须是公共的。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());
}
}
或
2.现场注入。将Kotlin类定义为:
class Car(@Inject var engine: Engine, @Inject val wheels: Wheels)
class Car @Inject constructor()
{
@Inject lateinit var engine: Engine
@Inject lateinit var wheel: Wheel
}
如果hope engine and wheel(希望引擎和车轮)为私有,则仅使用私有修饰符:
class Car @Inject constructor ()
{
private lateinit var engine: Engine
private lateinit var wheel: Wheel
}
嘿,你的解决方案是有效的,但它与private无关。即使你删除private,它也会有效。我相信它与“@Inject”注释有关,我是在变量级别添加的。明白了。它是关于@Inject构造函数的
class Car @Inject constructor()
{
@Inject lateinit var engine: Engine
@Inject lateinit var wheel: Wheel
}
class Car @Inject constructor ()
{
private lateinit var engine: Engine
private lateinit var wheel: Wheel
}