Jetpack Compose对话框内使用Accompanist FlowRow滚动出现异常效果
问题原因
- AlertDialog的text内容区默认没有限制最大高度,直接给FlowRow添加垂直滚动属性后,内容会无限延伸超出对话框边界,滚动时就会出现裁切、显示异常的问题
- 子元素Modifier的设置顺序有误:
Modifier.size(48.dp).padding(8.dp)是先固定组件尺寸再添加内边距,会导致实际可绘制区域被压缩,也可能引发布局偏移
修复方案
修改思路如下:
- 在FlowRow外层套一个Box,给Box设置
maxHeight限制滚动区域的最大高度,避免内容溢出对话框,数值可根据实际需求调整 - 调整子元素Modifier的顺序,改为先加padding再设置size,保证每个元素的显示大小符合预期
- 可选:如果使用Compose 1.4及以上版本,可以直接替换Accompanist的FlowRow为官方正式组件
androidx.compose.foundation.layout.FlowRow,无需额外引入Accompanist依赖
修改后的完整代码:
@Composable fun AlertDialogErrorTest() { var showDlg by remember { mutableStateOf(false)} val scrollState = rememberScrollState() if (showDlg) { AlertDialog( onDismissRequest = { showDlg = false }, title = { Text(text = "Pick something from the list") }, text = { // 新增外层Box限制滚动区域最大高度 Box(modifier = Modifier.maxHeight(300.dp)) { FlowRow(modifier = Modifier.verticalScroll(scrollState)) { for (i in 1..100) { // 调整Modifier顺序,先设置间距再固定尺寸 Box ( modifier = Modifier .padding(8.dp) .size(48.dp) .background(Color.LightGray), contentAlignment = Alignment.Center ) { Text (i.toString()) } } } } }, confirmButton = { TextButton(onClick = { showDlg = false }) { Text("Done") } }, dismissButton = { TextButton(onClick = { showDlg = false }) { Text("Cancel") } } ) } Button(onClick = {showDlg = true}) { Text("Show dialog") } }
内容的提问来源于stack exchange,提问作者Mackan
相关产品推荐
相关产品推荐

