Android Compose ModalBottomSheetLayout 引发大量重组问题
以下是几个常见的排查方向和解决方案:
检查
sheetShape参数的稳定性
你的代码中使用了CustomTheme.shapes.bottomSheetRadius,如果这个bottomSheetRadius是每次调用都生成新的Shape实例(比如直接在Shapes扩展属性中return RoundedCornerShape(...)),那么每次重组时sheetShape都会传入新对象,导致ModalBottomSheetLayout及其内部的sheetContent被迫重组。
解决方法:将bottomSheetRadius缓存为稳定实例,比如在Compose中用remember包裹:val bottomSheetRadius = remember { CustomTheme.shapes.bottomSheetRadius }再将这个缓存后的变量传入
sheetShape参数。排查
sdp扩展的稳定性
你在Column的padding中使用了10.sdp,如果这个sdp的实现没有正确处理缓存,每次调用返回不同的Dp值,也会触发Column的重组。可以临时替换为10.dp测试,如果重组频率降低,说明是sdp的问题,需要修复其实现或改用稳定的尺寸定义。检查父组件的重组频率
如果ModalBottomSheetLayout的父Compose组件本身在每秒数百次重组,那么它的所有子组件(包括sheetContent)也会跟着重组。可以给ModalBottomSheetLayout添加key参数隔离不稳定的父参数,同时排查父组件频繁重组的原因(比如未稳定的状态、频繁变化的参数等)。验证Layout Inspector的准确性
有时候Layout Inspector的重组计数可能存在误报,可以通过在sheetContent的Column中添加日志打印确认实际重组频率:sheetContent = { Column(modifier = Modifier.padding(bottom = 10.sdp)) { LaunchedEffect(Unit) { println("Sheet content recomposed") } } }如果日志打印频率确实很高,再针对性排查参数稳定性问题。
内容的提问来源于stack exchange,提问作者PadySo

