Jetpack作曲记忆功能不工作



我想在Jetpack Compose中创建一个可滚动的背景。问题是变量currentPadding"不是在值"padding"之后更新它的状态重组后被修改。在第一个组合(加载状态)中,"填充";设置为112。加载后,数值变为160.dp。这很奇怪,因为我在app的其他地方多次这样使用记忆函数这是第一次发生。你能帮我一下吗?非常感谢。

@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"),如当前所需的填充值,似乎没有任何工作。

您已将nestedScrollConnection放入记忆中。它还在第一次遇到填充变量时记住填充变量。因此,当padding的实际值被更改时,此更改不会在nestedScrollConnection中传播。

在onpresroll中加入padding

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