Если вы пишите под Android и используете MVVM и корутины, то у вас будет подобный код
class YourViewModel() : ViewModel() {
val state = MutableStateFlow<State>(State.Initial)
}По всем рекомендациям мы не должны давать наружу изменяемое состояние и все изменения должны делать только через методы. Самый простой вариант - указание отдельного публичного типа.
class YourViewModel() : ViewModel() {
private val _state = MutableStateFlow<State>(State.Initial)
val state: StateFlow<State>
get() = _state
}В Kotlin есть возможность указать разного типа для свойства и его field, но пока доступна только как экспериментальная. Использовать её в продакшен коде на текущем этапе жизни не рекомендуетсяС таким подходом мы закрыли через приведение типа на уровне свойства. Авторы Kotlin Coroutines позаботились о нас и сделали нашу жизнь проще с помощью функции asStateFlow(), который под капотом обернет
MutableStateFlow в ReadonlyStateFlow и вернёт его как StateFlow. Применяя оператор мы получим следующий код:class YourViewModel() : ViewModel() {
private val _state = MutableStateFlow<State>(State.Initial)
val state: StateFlow<State>
get() = _state.asStateFlow()
}Каждое обращение к свойства state будет приводить к созданию новому экземпляру
StateFlow, что является лишним, так как один StateFlow может иметь несколько коллекторов (подписчиков) на данные и никак не повлияет на работу, то можно сразу задавать свойство безе перегрузки get()class YourViewModel() : ViewModel() {
private val _state = MutableStateFlow<State>(State.Initial)
// Создаем StateFlow, предназначенный для получения
// состояния из вне ViewModel
val state = _state.asStateFlow()
}Больше подобных моих материалов и подборка интересных статей, книг, видео есть в Базе Знаний Android разработчика
#android #kotlin #coroutines #jetpack #viewmodel #AndroidBroadcast #БазаЗнаний