Я использую MVVM в своем приложении. Когда вы вводите запрос и нажимаете кнопку поиска, цепочка выглядит следующим образом: Fragment -> ViewModel -> Repository -> API -> Client. Клиент, где HTTP-запросы сделаны. Но здесь есть одна вещь: клиент должен сделать звонок и получить ключ от сервера при инициализации. Поэтому, чтобы предотвратить любой вызов до того, как этот первый вызов завершится, мне нужно иметь возможность наблюдать его из фрагмента, чтобы я мог отключить кнопку поиска. Поскольку каждый компонент в цепочке может взаимодействовать со смежными компонентами, все компоненты должны иметь состояние.
Я думаю реализовать класс StatefulComponent
и заставить все компоненты расширять его:
open class StatefulComponent protected constructor() {
enum class State {
CREATED, LOADING, LOADED, FAILED
}
private val currentState = MutableLiveData(State.CREATED)
fun setState(newState: State) {
currentState.value = newState
}
val state: LiveData<State> = currentState
val isLoaded: Boolean = currentState.value == State.LOADED
val isFailed: Boolean = currentState.value == State.FAILED
val isCompleted: Boolean = isLoaded || isFailed
}
Идея состоит в том, что каждый компонент наблюдает за следующим и обновляется соответствующим образом. Однако это невозможно для ViewModel, поскольку он уже расширяет ViewModel
суперкласс.
Как я могу реализовать решение для этой проблемы?