Jetpack Compose(M3):实现最小36dp且自适应高度的多行输入框
解决方案
要实现最小高度36dp且多行自动扩展的Outlined样式输入框,核心是调整OutlinedTextFieldDefaults.DecorationBox的默认最小高度限制,同时配合BasicTextField的多行配置:
覆盖DecorationBox的默认最小高度
外部的.heightIn或defaultMinSize会被DecorationBox自身的默认56dp最小高度覆盖,必须在DecorationBox的modifier里设置defaultMinSize(minHeight = 36.dp)才能生效。适配36dp高度调整内容内边距
原有的内边距会导致36dp高度下文本显示异常,需调整为更紧凑的数值,保证文本区域高度适配。开启多行模式并允许高度自适应
确保BasicTextField的singleLine设为false,同时用wrapContentHeight()让高度随内容自动扩展,搭配heightIn(min = 36.dp)锁定最小高度。
完整示例代码:
BasicTextField( value = text, onValueChange = { text = it }, singleLine = false, // 开启多行模式 modifier = modifier .heightIn(min = 36.dp) // 设定最小高度 .wrapContentHeight() // 允许高度随内容扩展 .fillMaxWidth(), decorationBox = @Composable { innerTextField -> OutlinedTextFieldDefaults.DecorationBox( value = text, innerTextField = innerTextField, enabled = true, singleLine = false, // 与BasicTextField保持一致 visualTransformation = VisualTransformation.None, contentPadding = PaddingValues(horizontal = 16.dp, vertical = 6.dp), // 适配36dp高度的内边距 modifier = Modifier .defaultMinSize(minHeight = 36.dp) // 覆盖DecorationBox默认最小高度 ) } )
关键说明
OutlinedTextFieldDefaults.DecorationBox内部默认使用OutlinedTextFieldDefaults.MinHeight(56dp),这是之前外部高度设置无效的核心原因,必须在它的modifier里重写最小高度。wrapContentHeight()确保输入框在内容换行时自动增高,heightIn(min=36.dp)保证空输入或单行时保持36dp的基础高度。- 调整
contentPadding是为了让文本在36dp高度内有合适的上下间距,避免文字被裁剪或过于拥挤。
内容的提问来源于stack exchange,提问作者aj3423
相关产品推荐
相关产品推荐

