Kotlin возвращает объект с неназначенными свойствами после назначения их в функции применения - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь выполнить довольно простую задачу: назначить свойства объекту и вернуть тот же объект после получения информации с помощью вызова REST.

В моем блоке runBlocking я использую функцию apply, чтобы изменить свойства моего объекта, но после попытки разных способов назначить их, создать экземпляр самого объекта, изменив конструкцию logi c объекта, я все равно получаю объект со значениями по умолчанию.

Вот мой объект Info :

class DrivingLicenceInfo {
     var type : String = ""
     var nationality : String = ""
     var number : String = ""
     var releaseDate : String = ""
     var expiryDate : String = ""
}

Вот метод, который доставляет мне проблемы:

    private fun getDerivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {

        return runBlocking {
            val response = retrieveDrivingLicenceInfoAsync().await()
            if (response.isSuccessful) {
                var info = DrivingLicenceInfo()
                response.body()?.let {

                    info.apply {
                        it.data.let { data ->
                            val type = data.guy
                            val drivingLicenseNationality = data.drivingLicenseNationality
                            val drivingLicenseNumber = data.drivingLicenseNumber
                            val drivingReleaseDate = data.drivingReleaseDate
                            val drivingExpiryDate = data.drivingExpiryDate

                            this.type = type
                            this.nationality = drivingLicenseNationality
                            this.number = drivingLicenseNumber
                            this.releaseDate = drivingReleaseDate
                            this.expiryDate = drivingExpiryDate
                        }
                    }
                    info
                    Log.i("driving.info.call", info.type)
                }
            }
            DrivingLicenceInfo()
        }
    }

И вот где я его использую, в моем Main, и где я получаю информационный объект с пустыми строками в качестве свойств

    private void getDrivingLicenceData() {
        DrivingLicenceInfoService service = new DrivingLicenceInfoServiceImpl(context);
        DrivingLicenceInfo info = service.getDrivingLicenceInfo();
        Log.i("driving.info.main",info.getType());
        profileViewModel.licenceNumber.postValue(info.getNumber());
        profileViewModel.licenceExpiryDate.postValue(info.getExpiryDate());
    }

Журнал в runBlocking правильно показывает свойство, журнал в моем Main даже не отображается. Используя отладчик, я вижу, что информация имеет пустые строки в качестве значения.

Может ли кто-нибудь помочь мне понять, что я делаю неправильно?

Спасибо

Ответы [ 2 ]

1 голос
/ 13 января 2020

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

private fun getDrivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
    return runBlocking {
        val response = retrieveDrivingLicenceInfoAsync().await()
        var info = DrivingLicenceInfo()    
        return if (response.isSuccessful) {
            response.body()?.let {
                info.apply {
                    type = it.data.guy
                    nationality = it.data.drivingLicenseNationality
                    number = it.data.drivingLicenseNumber
                    releaseDate = it.data.drivingReleaseDate
                    expiryDate = it.data.drivingExpiryDate
                }
                Log.i("driving.info.call", info.type)
                info
            } ?: info
        } else { info }
    }
}
0 голосов
/ 14 января 2020

Поскольку @JeelVankhede уже сообщил вам основную причину вашей проблемы, и у меня также есть несколько предложений, помимо того, что было дано @ WarrenFaith.

Если DrivingLicenceInfo является классом модели, вы можете объявить его как data class как

data class DrivingLicenceInfo (
  val type : String = "",
  val nationality : String = "",
  val number : String = "",
  val releaseDate : String = "",
  val expiryDate : String = ""
)

вы можете узнать больше о классе данных здесь .

А затем вы можете написать свою функцию как

private fun getDerivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
    val info = runBlocking {
      val response = retrieveDrivingLicenceInfoAsync().await()
      if (response.isSuccessful) {
        response.body()?.let {
          it.data.let { data ->
            DrivingLicenceInfo(
              type = data.guy,
              nationality = data.drivingLicenseNationality,
              number = data.drivingLicenseNumber,
              releaseDate = data.drivingReleaseDate,
              expiryDate = data.drivingExpiryDate
            )
          }
        } ?: DrivingLicenceInfo()
      } else {
        DrivingLicenceInfo()
      }
    }
    Log.i("driving.info.call", info.type)
    return info
  }
...