You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中BottomSheetScaffold重组时自动关闭的问题解决

问题解答

这种重组导致底部弹窗自动关闭的情况不属于正常现象,核心原因是BottomSheet的状态没有被正确持久化,重组时被重置回默认的收起状态。

原因分析

当你点击弹窗按钮修改getAllOrdersFromRestaurant的内容时,列表数据更新触发了Composable重组。如果BottomSheet的状态(比如BottomSheetState/ModalBottomSheetState)仅用remember保存,重组时会重新初始化;只有用rememberSaveable才能在重组、配置变更(如旋转屏幕)时保留状态。

解决方案

1. 用rememberSaveable持久化BottomSheet状态

根据你使用的BottomSheet类型,选择对应的状态保存方式:

  • 若使用BottomSheetScaffold的底部弹窗:
val bottomSheetState = rememberSaveable(stateSaver = BottomSheetSaver) {
    BottomSheetState(BottomSheetValue.Expanded) // 可根据需求设置初始状态
}
  • 若使用ModalBottomSheetLayout:
val bottomSheetState = rememberSaveable {
    ModalBottomSheetState(initialValue = ModalBottomSheetValue.Expanded)
}

将这个状态对象传入对应的Scaffold/Layout组件中,重组时状态就不会丢失。

2. 优化列表重组范围

你的列表代码可以简化,减少不必要的索引访问,避免额外的重组触发:

items(getAllOrdersFromRestaurant.value) { order ->
    if (order._id.toString() != orderId) {
        MeniuOfferItem(order, totalPrice)
    }
}

直接遍历列表元素,比通过count+索引访问更高效,也能减少潜在的重组问题。

3. 避免状态对象重复创建

确保bottomSheetState是在Composable的顶层作用域中创建,不要放在items循环、LaunchedEffect等会频繁执行的代码块内,防止每次重组都生成新的状态实例。

内容的提问来源于stack exchange,提问作者Cipri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:32:47