简体   繁体   中英

Kotlin - Clarification Needed Regarding the Data Classes Copy Function

Hello everyone I am new to Jetpack Compose. Needed clarification reagarding the usage of Copy Function in kotlin Data Classes.

Here i am using a NetworkFetchState abstract class, which helps me determine the state of the.network call.

// Abstract Class

abstract class NetworkFetchState(
 val isLoading: Boolean = false,
 val isSuccess: Boolean = false,
 val isError: Boolean = false,
 val error: Throwable? = null,
 val errorMessage: String? = null
)

I am creating the data class that is extending this abstract class

data class LoginDataState(
    val responseData: LoginResponse? = null
) : NetworkFetchState() // extending the Abstract Class

Now inside the ViewModel Class i am creating a mutable state flow

class MyViewModel:ViewModel(){
 
    // Mutable State Flow of the Data State
    private val _loginDataState = MutableStateFlow(LoginDataState())

    // readonly value of the __loginDataState
    val loginDataState: StateFlow<LoginDataState> get() = _loginDataState

/*
* Here I am performing network calls inside the view model scope
* based on the result from the network call i am trying to update the MutableStateFlow
*/

  fun makeNetworkCall(){
    // ....
    _loginDataState.update { prevState ->
        prevState.copy(
         // ---- PROBLEM HERE ----
         // isLoading, isSuccess.. etc (all other variables from abstract class)
         // are not available
        )
     }
  }

}

all the member variables that are extending from abstract class are not visible.

What am i doing wrong?

The .copy function is a function generated by kotlin compiler for all data classes. As per the documentation , it's using only properties declared in the primary constructor .

If you want to change those properties with copy function, you will have to add them to the primary constructor somehow.

// this would work
data class LoginDataState(
    val responseData: LoginResponse? = null,
    val _isLoading: Boolean = false,
) : NetworkFetchState(isLoading = _isLoading)

// this is probably better
interface NetworkFetchState {
    val isLoading: Boolean get() = false
}

data class LoginDataState(
    val responseData: LoginResponse? = null,
    override val isLoading: Boolean = false,
) : NetworkFetchState

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM