Как объявить значение publi c (val) в классе Kotlin, чтобы инициализировать его позже. Не может использовать var в данном конкретном случае - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь сделать простое приложение для камеры на Android Использование Kotlin. Я не могу преобразовать код java в Kotlin. Как объявить cameraDevice в Kotlin?

Java Код:

class MainActivity extends AppCompatActivity{
protected CameraDevice cameraDevice;
    private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice camera) {
            //This is called when the camera is open
            cameraDevice = camera;
            randomFunction();
        }
        @Override
        public void onDisconnected(CameraDevice camera) {
            cameraDevice.close();
        }
        @Override
        public void onError(CameraDevice camera, int error) {
            cameraDevice.close();
             cameraDevice = null;
        }
    };
}

Kotlin Код:

class MainActivity : AppCompatActivity(){
    val cameraDevice:CameraDevice?;
    private val stateCallback: CameraDevice.StateCallback = object : CameraDevice.StateCallback() {
        override fun onOpened(camera: CameraDevice) {
            //This is called when the camera is open
            cameraDevice = camera;
            randomFunction();
        }
        override fun onDisconnected(camera: CameraDevice) {
            cameraDevice.close();
        }
        override fun onError(camera: CameraDevice, error:Int) {
            cameraDevice.close();
            cameraDevice = null;
        }
    };
}

Я не могу определить его как переменную, он выбрасывает Разрешены только безопасные (?.) Или ненулевые утверждения (!!.) На обнуляемом приемнике типа CameraDevice? и я не могу объявить это в функции, выдает ту же ошибку.

Ответы [ 3 ]

2 голосов
/ 23 января 2020

Вы должны использовать lateinit для cameraDevice следующим образом:

lateinit var cameraDevice: CameraDevice

Если вы столкнетесь с onError, вы проверяете, была ли инициализирована cameraDevice, и только затем вызываете close() it чтобы не получить UninitializedPropertyAccessException.

@Override
public void onError(CameraDevice camera, int error) {
    if(::cameraDevice.isInitialized) {
        cameraDevice.close();
    }
}
0 голосов
/ 23 января 2020

когда вы делаете это

     val cameraDevice:CameraDevice?;

val переменная должна быть начальной initialization означает, что у вас есть назначаемое значение при объявлении, и после initialization переменной вы не можете изменить ее значение.

Если вы хотите выполнить позднюю инициализацию, вы можете сделать это следующим образом:

  var  cameraDevice:CameraDevice?=null // you have to assign the null at initial 

ИЛИ вы можете использовать lateinit так же, как это

  lateinit var cameraDevice:CameraDevice  //this does not required initialization at initial level
0 голосов
/ 23 января 2020

cameraDevice может быть нулевым в любое время. Таким образом, вам придется утверждать не нуль, чтобы выполнить ваш код. Но убедитесь, что cameraDevice здесь никогда не равен нулю. Поэтому используйте ваш код, как показано ниже

@Override
        public void onOpened(CameraDevice camera) {
            //This is called when the camera is open
            cameraDevice!! = camera;
            randomFunction();
        }

Используйте это везде в вашем коде.

...