首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetpack编写记忆功能不工作

Jetpack编写记忆功能不工作
EN

Stack Overflow用户
提问于 2022-12-02 21:28:34
回答 1查看 37关注 0票数 1

我试图在Jetpack撰写中创建一个可滚动的背景。问题是变量"currentPadding“在”填充“值在重新组合后修改后不会更新它的状态。在第一个组合(加载状态)中,“填充”值设置为112.dp,加载后值更改为160.dp。这很奇怪,因为我在应用程序的其他地方多次使用了remember函数,这是第一次发生这种情况。我可以请您帮个忙吗?非常感谢。

代码语言:javascript
复制
@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"),就像当前所需的填充值一样,似乎没有什么起作用。

EN

回答 1

Stack Overflow用户

发布于 2022-12-02 22:42:42

记住,你已经把nestedScrollConnection放进去了。当第一次遇到时,它还会记住填充变量。因此,当填充的实际值发生更改时,此更改不会在nestedScrollConnection的remember中传播。

将填充物放入onPreScroll内部。

代码语言:javascript
复制
    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
            }

...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74661659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档