Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 主构造函数出现Kotlin Dagger2错误_Android_Kotlin_Dependency Injection_Dagger 2 - Fatal编程技术网

Android 主构造函数出现Kotlin Dagger2错误

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

我正在尝试我的手学习匕首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.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
}