我在试图解决a case时偶然发现了这个问题。总之,病人需要完全控制卷轴的“速度”。现在,Android的默认设置使项目始终跟随用户的手指滚动,但显然,患者的一个未共享的条件/要求导致他们希望用户滚动得比实际滚动的项目更远。因此,我建议,正如David in his solution最初建议的那样,禁用用户对惰性列表的直接控制,并通过观察触摸检测回调中的事件来手动滚动它,比如pointerInput(...)修饰符提供的事件。因此,执行:
@Composable
fun LazyStack(sdd: Int = 1) { // Scroll-Distance-Divisor
val lazyStackState = rememberLazyListState()
val lazyStackScope = rememberCoroutineScope()
LazyColumn(
modifier = Modifier.pointerInput(Unit) {
detectVerticalDragGestures { _, dragAmount ->
lazyStackScope.launch {
lazyStackState.scrollBy(-dragAmount / sdd)
}
}
},
state = lazyStackState,
userScrollEnabled = false
) {
items((0..500).map { LoremIpsum(randomInt(5)) }) {
Text(text = it.values.joinToString(" "))
}
}
}现在,治疗确实起作用了,除了..。显然是微小的副作用。
你看,这个列表在大部分情况下都是完美的滚动。例如,如果我将sdd参数作为2传递,滚动距离将减少到其原始值的一半。但是,副作用是“抓拍”。
显然,当滚动在列表中时,在列表的两边都有某些“点”,当用户使用它们的输入指针(手指、鼠标或任何其他指针都在积极地“保存”列表)时,列表就会“抓取”。现在,这是一个点,如果你向任何一个方向交叉,列表就会被截取,而且很明显,每一次的值都是完全相同的。
上面的列表使用Lorem作为约定,但也许编号列表有助于诊断问题。
因此,症状概要如下:
列表中似乎有特定的“点”,在整个列表/屏幕中以不一致的间隔/位置出现,这往往会使列表在许多像素中迅速滚动。一旦被发现,这些穴位就会持续存在,除非重新组合,否则可以用来重新产生症状。当连续记录scrollBy方法返回的值时,"snap“的值显然不会返回为大量浮点数。这使得常规诊断技术无法追踪这一问题,这就是为什么我们,诊断人员在这里。
你有病史你有症状。让鉴别诊断开始。
发布于 2022-08-30 15:45:07
抓取行为是由于在可组合的范围内错误地使用randomInt(5)造成的。列表生成应该在视图模型中,然后在滚动过程中没有重新生成列表,并且一切都很完美。
而且,使用detectVerticalDragGestures并不像我最初提出的使用modfiier.scrollable(...)的建议那样顺利,但也许这是我想要的效果。
https://stackoverflow.com/questions/73521674
复制相似问题