我试图在Jetpack撰写中创建一个可滚动的背景。问题是变量"currentPadding“在”填充“值在重新组合后修改后不会更新它的状态。在第一个组合(加载状态)中,“填充”值设置为112.dp,加载后值更改为160.dp。这很奇怪,因为我在应用程序的其他地方多次使用了remember函数,这是第一次发生这种情况。我可以请您帮个忙吗?非常感谢。
@Composable
fun ScrollableBackground(
scrollState: ScrollState,
composable: ComposableFun,
modifier: Modifier = Modifier,
isBannerListEmpty: Boolean,
) {
val padding = if (isBannerListEmpty) {
112.dp
} else {
160.dp
}
val minPadding: Dp = 29.dp
val dp0 = dimensionResource(id = R.dimen.no_dp)
var currentPadding: Dp by remember { mutableStateOf(padding) }
val state: Dp by animateDpAsState(targetValue = currentPadding)
val nestedScrollConnection: NestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val percent = scrollState.value.toFloat() / scrollState.maxValue.toFloat() * 100f
val delta = available.y.dp
val newSize = currentPadding + delta / 3
currentPadding = when {
percent > 20f -> minPadding
newSize < minPadding -> minPadding
newSize > padding -> padding
else -> newSize
}
return Offset.Zero
}
}
}
Box(
modifier = modifier
.fillMaxSize()
.nestedScroll(nestedScrollConnection)
) {
Surface(
color = White,
modifier = Modifier
.padding(top = state)
.fillMaxSize()
.clip(
CircleShape.copy(
topStart = Shapes.medium.topStart,
topEnd = Shapes.medium.topEnd,
bottomEnd = CornerSize(dp0),
bottomStart = CornerSize(dp0)
)
)
) {}
composable.invoke()
}}
我尝试将其他类型的参数从视图模型发送到可组合(而不是布尔值,在本例中是"isBannerListEmpty"),就像当前所需的填充值一样,似乎没有什么起作用。
发布于 2022-12-02 22:42:42
记住,你已经把nestedScrollConnection放进去了。当第一次遇到时,它还会记住填充变量。因此,当填充的实际值发生更改时,此更改不会在nestedScrollConnection的remember中传播。
将填充物放入onPreScroll内部。
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val padding = if (...) { //Don't use isBannerListEmpty here as neither this will update on recomposition
112.dp
} else {
160.dp
}
...https://stackoverflow.com/questions/74661659
复制相似问题