Search code examples
androidkotlinscopeassignkotlin-coroutines

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


I'm trying to do a quite simple task: assign properties to an object and return that same object after retrieving the infos with a REST call.

In my runBlocking block I use the apply function to change the properties of my object, but after trying different ways to assign them, instantiate the object itself, modifying constructing logic of the object, I still get an object with the default values.

Here's my Info object:

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

Here's the method which gives me problems:

    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()
        }
    }

And here's where I use it, in my Main, and where I get an info object with empty strings as properties

    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());
    }

The log in the runBlocking correctly shows the property, the log in my Main doesn't even show up. Using the debugger I am able to see that info has empty strings as value.

Could somebody help me to figure out what I'm doing wrong?

Thank you


Solution

  • Since @JeelVankhede already told you the main reason of your problem and I also have some suggestions apart from the one given by @WarrenFaith.

    If DrivingLicenceInfo is a model class you can declare it as data class like

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

    you can read more about data class here.

    And then you can write your function as

    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
      }