TGViewer
Android Broadcast Android Broadcast @android_broadcast · 14.6K subscribers
Post #8499 7.27K
Как правильно работать с MutableStateFlow внутри ViewModel и из вне

Если вы пишите под 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 #БазаЗнаний
  • 👍 71
  • 🤯 5
  • ❤ 1
More from @android_broadcast
  1. Oct 16, 2026🤖 У Android появился навык для ИИ-агентов: поиск и разбор ANR На developer.android.com вы…
  2. Oct 16, 2026🔨 В Android Studio Rabbit 2 можно выкладывать билд на тестовый трек Play прямо из IDE В к…
  3. Oct 16, 2026🤖 DexSQL: SQL-запросы к APK и DEX, а для агентов есть MCP Команда LSPosed выпустила DexSQ…
  4. Oct 15, 2026🤖 Android прячет логины в WebView при показе экрана и запрещает приложениям тихо включать…
  5. Oct 14, 2026#видеозаписи #МобильныйВторник Осенний Mobius — уже на следующей неделе! А сегодня мы откр…
  6. Oct 14, 2026🔐 Волна утечек в Японии: эндпоинты и ключи API достают из публичных приложений 8 октября…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →