Аккомпанемент FlowRow: можно ли автоматически прокрутить вниз, чтобы показать элемент?

В моем проекте Jetpack Compose один из моих компонентов использует от файлAccompanist . Но я не знаю, как сделать прокрутку до данного «узла».

Вот соответствующий код из моего @Composable:

      sealed class MovesNavigatorElement(open val text: String)
data class MoveNumber(override val text: String) : MovesNavigatorElement(text)
data class HalfMoveSAN(override val text: String) : MovesNavigatorElement(text)

@Composable
fun MovesNavigator(modifier: Modifier = Modifier, elements: Array<MovesNavigatorElement>, mustBeVisibleByDefaultElementIndex: Int) {
    val vertScrollState = rememberScrollState()

    FlowRow(
        modifier = modifier
            .background(color = Color.Yellow.copy(alpha = 0.3f))
            .verticalScroll(vertScrollState),
        mainAxisSpacing = 10.dp,
        crossAxisSpacing = 15.dp,
    ) {
        elements.map {
            Text(text = it.text, fontSize = 34.sp, color = Color.Blue, style= MaterialTheme.typography.body1)
        }
    }
}

Вы можете видеть, что я объявляю "узлы" FlowRow в виде списка: параметр elements. Также я использую ScrollState в локальной переменной vertScrollState.

Но, допустим, я хочу прокрутить его до elements[30]: как мне это сделать? Учитывая, что mustBeVisibleByDefaultElementIndex- это индекс элемента, который должен быть видим по умолчанию . Я имею в виду, когда происходит композиция. Но пользователь, конечно, может изменить положение позже .

2 ответа

Решение

В ScrollState разоблачает scrollTo а также animateScrollToметоды. Вы можете легко использовать их для достижения желаемого результата. Обратитесь к документации

Вот как мне удается (частично) решить мою проблему:

  1. использовать простой ScrollState вместо того rememberScrollState(): потому что даже если я установлю фиксированное значение прокрутки при перекомпоновке, пользователь все равно сможет его перемещать. Таким образом, нет необходимости «кэшировать» значение прокрутки.
  2. используйте преобразование sp в px для количества прокрутки, которое ожидается как значение в пикселях, и жестко запрограммированное количество деления данного индекса (поэтому оно решено только частично)

Это привело меня к следующему:

      sealed class MovesNavigatorElement(open val text: String)
data class MoveNumber(override val text: String) : MovesNavigatorElement(text)
data class HalfMoveSAN(override val text: String) : MovesNavigatorElement(text)

@Composable
fun MovesNavigator(modifier: Modifier = Modifier, elements: Array<MovesNavigatorElement>, mustBeVisibleByDefaultElementIndex: Int = 0) {
    val lineHeightPixels = with(LocalDensity.current) {34.sp.toPx()}
    val scrollAmount = ((mustBeVisibleByDefaultElementIndex / 6) * lineHeightPixels).toInt()
    val vertScrollState = ScrollState(scrollAmount)

    FlowRow(
        modifier = modifier
            .background(color = Color.Yellow.copy(alpha = 0.3f))
            .verticalScroll(vertScrollState),
        mainAxisSpacing = 8.dp,
    ) {
        elements.map {
            Text(text = it.text, fontSize = 34.sp, color = Color.Blue, style= MaterialTheme.typography.body1)
        }
    }
}

Но все равно придется тестировать на нескольких устройствах.

Другие вопросы по тегам