-1

在我的 Jetpack Compose 项目中,我的一个组件使用了FlowRow来自Accompanist的组件。但我不知道如何FlowRow滚动到给定的“节点”。

这是我的相关代码@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局部变量中使用 a vertScrollState

但是,假设我想让它滚动到elements[30]:我应该怎么做?鉴于这是默认情况下必须可见mustBeVisibleByDefaultElementIndex的元素的索引。我的意思是,当组合发生时。但是用户当然可以稍后更改位置

换句话说 :

  1. At composition :给定索引的元素可见
  2. 然后,当然,在任何其他组合发生之前,用户可以使用滚动条滚动它。
4

2 回答 2

1

你只需要使用方法参数,

val state = rememberScrollState(initial = mustBeVisibleByDefault)

最好在访问网络之前按Ctrl+查看所有可能的组合。P

我保留了这个以防万一有人觉得它有帮助:-

ScrollState暴露scrollToanimateScrollTo方法。您可以轻松地使用它们来实现所需的结果。参考文档

于 2021-11-06T15:03:09.320 回答
0

在这里,我如何设法解决(部分)我的问题:

  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)
        }
    }
}

但仍需在多台设备上进行测试。

于 2021-11-07T15:49:23.087 回答