Kotlin — необходимо разъяснение относительно функции копирования классов данных
Привет всем, я новичок в Jetpack Compose. Необходимо разъяснение относительно использования функции копирования в классах данных kotlin.
Здесь я использую абстрактный класс NetworkFetchState , который помогает мне определить состояние сетевого вызова.
// Абстрактный класс
abstract class NetworkFetchState(
val isLoading: Boolean = false,
val isSuccess: Boolean = false,
val isError: Boolean = false,
val error: Throwable? = null,
val errorMessage: String? = null
)
Я создаю класс данных, который расширяет этот абстрактный класс.
data class LoginDataState(
val responseData: LoginResponse? = null
) : NetworkFetchState() // extending the Abstract Class
Теперь внутри класса ViewModel я создаю поток изменяемого состояния.
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
)
}
}
}
все переменные-члены, которые расширяются из абстрактного класса, не видны.
Что я делаю не так?
1 ответ
The .copy
function — это функция, сгенерированная компилятором kotlin для всех классов данных. Согласно документации , он использует только свойства, объявленные в основном конструкторе .
Если вы хотите изменить эти свойства с помощью функции копирования, вам придется каким-то образом добавить их в основной конструктор.
// 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