Составной разделитель становится невидимым при размещении внутри составного элемента с установленным модификатором horizontalScroll. Это ошибка?
Фон
Я делаю настольное приложение для компоновки.
У меня была записка с разделением предметов. ширина может не уместиться в окне, поэтому я сделал горизонтальную прокрутку, заключив ее в
horizontalScroll()
набор модификаторов.
Теперь
LazyColumn
также стала горизонтальной прокручиваемой. Но как ни странно, разделительные предметы исчезли.
Покопавшись в нем некоторое время, я понял, что он становится невидимым только тогда, когда помещается внутри горизонтально прокручиваемого родителя.
Минимальное воспроизведение
Вот минимальное воспроизведение наблюдаемого поведения, когда красный цвет явно невидим, когда
horizontalScroll(rememberScrollState())
модификатор устанавливается во включении
Box
.
fun main() = application {
Window(onCloseRequest = ::exitApplication) {
Box(
Modifier.fillMaxSize()
.background(Color.Green)
.horizontalScroll(rememberScrollState())
) {
Divider(thickness = 10.dp, color = Color.Red)
}
}
}
Как видно, красный цвет невидим для кода выше.
Ожидаемый результат:
С участием
verticalScroll()
или вообще без модификатора прокрутки работает нормально, как и ожидалось.
fun main() = application {
Window(onCloseRequest = ::exitApplication) {
Box(
Modifier.fillMaxSize()
.background(Color.Green)
.verticalScroll(rememberScrollState())
) {
Divider(thickness = 10.dp, color = Color.Red)
}
}
}
Правильный вывод, как и ожидалось, красный
Divider
хорошо виден для приведенного выше кода.
Информация о версии
kotlin("jvm") version "1.5.21"
id("org.jetbrains.compose") version "1.0.0-alpha3"
Я хотел бы знать, если это ошибка? или есть способ исправить это.
1 ответ
Нет, это не ошибка.
используется для получения полной ширины, как и любой другой вид с
fillMaxWidth()
модификатор.
Но внутри этот модификатор игнорируется, потому что он неоднозначен: обертывает размер содержимого, поэтому
maxWidth
ограничение в этой области бесконечно.
Из
fillMaxWidth
документация :
Если входящая максимальная ширина
Constraints.Infinity
этот модификатор не действует.
Я не нашел никакой документации, в которой упоминалось бы
horizontalScroll
эффекты
Constraints
, вы можете увидеть ответ сопровождающего по той же проблеме или протестировать его самостоятельно следующим образом:
Box {
BoxWithConstraints(Modifier.fillMaxSize()) {
// output 1080 2082
println("non scrollable max dimensions: ${constraints.maxWidth} ${constraints.maxHeight}")
}
BoxWithConstraints(Modifier.fillMaxSize().horizontalScroll(rememberScrollState())) {
// output 2147483647 2082
println("scrollable max dimensions: ${constraints.maxWidth} ${constraints.maxHeight}")
}
}
В этом случае вам необходимо явно указать ширину, например:
Box(
Modifier
.fillMaxSize()
.background(Color.Green)
.horizontalScroll(rememberScrollState())
) {
var width by remember { mutableStateOf(0) }
val density = LocalDensity.current
val widthDp = remember(width, density) { with(density) { width.toDp() } }
LazyColumn(
modifier = Modifier.onSizeChanged {
width = it.width
}
) {
items(100) {
Text("$it".repeat(it))
Divider(
thickness = 10.dp,
color = Color.Red,
modifier = Modifier.width(widthDp)
)
}
}
}
Обратите внимание, что когда верхняя часть вашего
LazyColumn
меньше нижнего, как в моем примере, ширина сначала будет меньше (чтобы разместить только видимую часть), но после прокрутки вниз и назад ширина не будет восстановлена до исходной ширины, потому что
Divider
Модификатор ширины не позволит ему сжаться обратно. Если вам нужно предотвратить это, вам нужно рассчитать "ширину" только на основе видимых элементов, что является более сложным.