Версия библиотеки материалов (M2, M3 или обе?): M3 (
Код: Выделить всё
androidx.compose.material3:material3:1.4.0Используемый компонент Material Compose: BottomSheetScaffold, ModalBottomSheet
Сборка Android Studio: Добавление функций Narwhal 4 | 2025.1.4 | #AI-251.27812.49.2514.14217341, создано 6 октября 2025 г.
Версия Kotlin: 2.2.20
Шаги по воспроизведению или образец кода для воспроизведения:
- Настройте проект с androidx.compose.material3:material3 версии 1.4.0 или выше.
- Определите глобальную схему движения в теме приложения, например motionScheme = MotionScheme.standard().
Код: Выделить всё
// in core/designsystem/src/main/java/io/eze/apps/charging/core/designsystem/theme/Theme.kt MaterialTheme( colorScheme = colorScheme, typography = typography, motionScheme = MotionScheme.standard(), content = content, ) - Реализуйте BottomSheetScaffold и поместите прокручиваемый компонент, например LazyColumn, внутри его содержимого.
- Запустите приложение, разверните нижний лист и попытайтесь прокрутить LazyColumn вверх и вниз. Лист будет казаться слишком чувствительным и будет пытаться свернуться даже при небольших жестах вертикальной прокрутки.
Не применимо.
Описание:
Начиная с версии 1.4.0 библиотеки Material 3, BottomSheetScaffold и ModalBottomSheet использовали жестко закодированную схему выразительного движения, которая игнорирует motionScheme, установленный глобально в MaterialTheme.
Это изменение привело к серьезной ошибке удобства использования с вложенным прокручиваемым содержимым. Когда прокручиваемый компонент, такой как LazyColumn, размещенное внутри BottomSheetScaffold, жестко закодированное выразительное движение делает лист слишком чувствительным к жестам перетаскивания. Незначительные движения, предназначенные для прокрутки списка, часто ошибочно интерпретируются как жест свертывания листа. Это чрезвычайно затрудняет взаимодействие пользователей с содержимым нижнего листа и создает неприятные ощущения.
Основная причина, по-видимому, заключается в жестко запрограммированных спецификациях анимации в исходном коде компонента. Исходный код BottomSheetScaffold.kt для версии 1.4.0 содержит комментарий TODO, подтверждающий, что значения не загружены из схемы движения:
Код: Выделить всё
// in androidx.compose.material3.BottomSheetScaffold.kt
// TODO Load the motionScheme tokens from the component tokens file
val anchoredDraggableMotion: FiniteAnimationSpec =
MotionSchemeKeyTokens.DefaultSpatial.value()
val showMotion: FiniteAnimationSpec = MotionSchemeKeyTokens.DefaultSpatial.value()
val hideMotion: FiniteAnimationSpec = MotionSchemeKeyTokens.FastEffects.value()
Как разработчику мне нужно иметь возможность контролировать или даже отключать эти анимации на уровне темы. Это необходимо, чтобы исправить критическую ошибку вложенной прокрутки и обеспечить единообразный внешний вид во всем приложении. Текущая реализация требует особого стиля анимации, который нарушает фундаментальное взаимодействие с пользователем.
Библиотеки AndroidX-Compose, которые я использую:
Код: Выделить всё
androidxComposeBom = "2025.10.00"
androidxComposeMaterial3 = "1.4.0"
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" }
androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" }
androidx-compose-material = { group = "androidx.compose.material", name = "material" }
androidx-compose-material-icons-core = { module = "androidx.compose.material:material-icons-core" }
androidx-compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-compose-ui-util = { group = "androidx.compose.ui", name = "ui-util" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidxComposeMaterial3" }
Код: Выделить всё
@Composable
@OptIn(ExperimentalMaterial3Api::class)
fun CommentsBottomSheet(
onBottomSheetDismissed: () -> Unit,
user: User,
comments: List,
onReplyClicked: (Comment) -> Unit = {},
onCommentSubmitted: (SentCommentUiModel) -> Unit = {}
) {
ModalBottomSheet(
onDismissRequest = onBottomSheetDismissed,
sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
) {
CommentsBottomSheetContent(
user = user,
comments = comments,
onReplyClicked = onReplyClicked,
onCommentSubmitted = onCommentSubmitted
)
}
}
@Composable
private fun CommentsBottomSheetContent(
user: User,
comments: List,
onReplyClicked: (Comment) -> Unit = {},
onCommentSubmitted: (SentCommentUiModel) -> Unit = {}
) {
Column(
modifier = Modifier
.fillMaxHeight(fraction = 0.93f) // Limit the content height
) {
CommentList(
modifier = Modifier
.weight(1f)
.padding(16.dp),
comments = comments,
onReplyClicked = onReplyClicked,
onCommentSubmitted = onCommentSubmitted
)
CommentInputLayout(
user = user,
onCommentSubmitted = onCommentSubmitted
)
}
}
https://issuetracker.google.com/action/ ... nload=true
Кроме того, об этой проблеме сообщалось в https://issuetracker.google.com/issues/452071842
Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-scrolli
Мобильная версия