.qwen/skills/loading-overlay/SKILL.md
Блокировка UI контента экрана во время загрузки данных или выполнения асинхронных операций с отображением индикатора загрузки. Используй этот навык при разработке экранов с сетевыми запросами, операциями CRUD и других асинхронных действий.
npx skillsauth add easydev991/Jetpack-WorkoutApp loading-overlayInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
В ViewModel добавь StateFlow<Boolean> для отслеживания состояния загрузки:
private val _isProcessing = MutableStateFlow(false)
val isProcessing: StateFlow<Boolean> = _isProcessing.asStateFlow()
В методах операций устанавливай _isProcessing.value = true в начале и _isProcessing.value = false в блоке finally.
В Composable экране собери состояние через collectAsState() и передай в безымянный компонент:
val isProcessing by viewModel.isProcessing.collectAsState()
MyFriendsScreenContent(
// другие параметры...
isProcessing = isProcessing
)
В безымянном компоненте:
enabled = !isProcessing в компоненты с контентомLoadingOverlayView из дизайн-системы поверх контента при загрузкеBox(modifier = Modifier.fillMaxSize()) {
Content(enabled = !isProcessing)
if (isProcessing) {
LoadingOverlayView()
}
}
Примечание: LoadingOverlayView автоматически занимает весь размер родительского Box и блокирует все жесты. Компонент находится в com.swparks.ui.ds.
В компонентах списка передай enabled в интерактивные элементы:
Box(
modifier = Modifier.clickable(enabled = enabled) { onClick() }
) {
UserRowView(/* параметры */)
}
UiState.Loading)UiState.Success)enabled = false)isProcessing = true)isProcessing = false)isLoading)isProcessing)combine или в UI (!isLoading && !isProcessing)Используй обычный CircularProgressIndicator или LoadingIndicator в центре экрана в блоке when для UiState.Loading.
Используй LoadingOverlayView из дизайн-системы поверх контента в Box с isProcessing. Этот компонент автоматически блокирует все жесты и занимает весь размер родительского контейнера.
Для кнопок с операциями CRUD используй встроенный CircularProgressIndicator или параметр enabled.
Подробные примеры реализации см. в файле references/EXAMPLES.md:
Всегда используй Box с Modifier.fillMaxSize() для контента, чтобы LoadingOverlayView мог отобразиться поверх и корректно заблокировать все жесты.
LoadingOverlayView из дизайн-системы автоматически занимает размер родительского Box и блокирует все жесты. Нет необходимости использовать matchParentSize() или fillMaxSize().
Всегда используй try-finally для гарантированного снятия блокировки при успешном выполнении или ошибке.
Не забудь передать enabled во все кликабельные элементы: кнопки, кликабельные Box/Row/Surface.
StateFlow<Boolean> для состояния загрузки в ViewModeltry-finally для надежной блокировкиcollectAsState()enabled = !isProcessing в безымянный компонентLoadingOverlayView() из дизайн-системы поверх контента при загрузкеenabled в интерактивные элементы списка (кнопки, кликабельные области)testing
Пиши тесты в андроид-проекте правильно. Используй этот навык при написании любых типов тестов (unit, integration, UI), тестировании бизнес-логики, сетевых функций и компонентов UI.
tools
Реализуй pull-to-refresh в Jetpack Compose с использованием Material 3 PullToRefreshBox. Используй этот навык при добавлении возможности обновления данных на экранах со списками или карточками.
tools
Правильно работай с локализацией в Android-проекте. Используй этот навык при добавлении новых строковых ресурсов, работе с plurals, форматировании дат и текстов.
tools
Корректная обработка безопасных зон в Jetpack Compose приложениях для Android. Используй при работе с TopAppBar, Scaffold и безопасными зонами экранов в Jetpack-WorkoutApp.