Kotlin returns 对象在 apply 函数中分配后具有未分配的属性

Kotlin returns object with unassigned properties after assigning them in apply function

我正在尝试执行一项非常简单的任务:将属性分配给一个对象,并在使用 REST 调用检索信息后 return 为同一对象分配属性。

在我的 runBlocking 块中,我使用 apply 函数来更改我的对象的属性,但是在尝试了不同的方法来分配它们、实例化对象本身、修改对象的构造逻辑之后,我仍然得到一个对象默认值。

这是我的信息对象:

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 中的日志甚至没有显示。 使用调试器,我能够看到该信息具有空字符串作为值。

有人可以帮我弄清楚我做错了什么吗?

谢谢

除了@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 }
    }
}

因为@JeelVankhede 已经告诉你问题的主要原因,除了@WarrenFaith 给出的建议,我还有一些建议。

如果 DrivingLicenceInfo 是一个模型 class 你可以像

一样将它声明为 data class
data class DrivingLicenceInfo (
  val type : String = "",
  val nationality : String = "",
  val number : String = "",
  val releaseDate : String = "",
  val expiryDate : String = ""
)

您可以阅读有关数据的更多信息 class here

然后你可以把你的函数写成

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
  }