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.