TGViewer
Android Broadcast Android Broadcast @android_broadcast · 14.6K subscribers
Post #8546 6.14K
Не используйте null для отсутcтвия состояния в UI

Сталкиваюсь с решениями разработчиков, когда они используют null для задания состояния UI по умолчанию. Мне такой подход не нравится 😡. У элементов обычно всегда есть начально состояние. Например, прогресс скрыт, данных списка нету, и др. Либо вовсе эти элементы не показываются и используется экран-заглушка

В коде я выражаю такое состояние следующим образом

private val _screenState =
MutableStateFlow<ScreenState>(ScreenState.Default)

val screenState = _screenState.asStateFlow()

sealed interface ScreenState {

object Default : ScreenState // Иногда называю None
data class DataLoaded(...) : ScreenState
data class Loading(...): ScreenState
}

@Composable
fun MyScreen() {
val state: ScreenState by stateFlow.collectAsState()
MyScreen(state)
}

@Composable
fun MyScreen(state: ScreenState): Unit = when(state) {
is ScreenState.Default -> Default(state)
is ScreenState.Loading -> ProgressScreen(state)
is ScreenState.DataLoaded -> DataScreen(state)
}

@Composable
private fun DefaultSceen(state: ScreenState.Default)

@Composable
private fun ProgressScreen(state: ScreenState.Loading)

@Composable
private fun DataScreen(state: ScreenState.DataLoaded)


также Default можно заменить на ссылку на другое состояние, и при этом не сломать код выше

sealed interface ScreenState {

data class DataLoaded(...) : ScreenState
data class Loading(...): ScreenState

companion object {
val Default: ScreenState
get() = Loading(...)
}
}


Использование null вместо Default приведет к неудобным аспектам работы с кодом:
1. Придется использовать null safety или операторы Flow для работы с null
2. Любые задания начальных состояний UI элементов придется привязывать не через поле в объекте состояния, а через связывание с null состоянием
3. Расширить/изменить null нельзя, а вот класс можно дополнить полями/методами и включить в анализ кода

#android #compose #AndroidBroadcast #БазаЗнаний
  • 👍 122
  • ❤ 5
  • 🤯 4
  • 🎉 3
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 →