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 .copyfunction — это функция, сгенерированная компилятором 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
Другие вопросы по тегам