Jetpack Compose中BasicTextField获焦时标题不向上偏移问题求助
Fix Label Floating on Focus for BasicTextField
我一眼就发现问题所在了——你创建了MutableInteractionSource但没把它传给BasicTextField本身!这就导致焦点状态根本没同步到你给indicatorLine和TextFieldDecorationBox用的那个交互源里,所以组件聚焦时,DecorationBox完全感知不到,自然不会触发label上移的逻辑。
下面是修复后的完整代码,我标注了关键修改点:
fun TextFieldRow(data: TextFieldData) { val interactionSource = remember { MutableInteractionSource() } val text by data.text.observeAsState("") // 新增:从交互源收集实时焦点状态 val isFocused by interactionSource.collectIsFocusedAsState() Row( modifier = Modifier .fillMaxWidth() .padding(start = 20.dp, end = 20.dp, top = 17.dp) ) { BasicTextField( value = text, onValueChange = { data.text.value = it }, // 关键修改1:把自定义交互源传给BasicTextField,让焦点变化能被捕获 interactionSource = interactionSource, modifier = Modifier .padding(vertical = 6.dp) .fillMaxWidth() .indicatorLine( enabled = true, isError = false, interactionSource = interactionSource, colors = TextFieldDefaults.textFieldColors() ) ) { innerTextField -> TextFieldDefaults.TextFieldDecorationBox( value = text, innerTextField = innerTextField, enabled = true, singleLine = true, visualTransformation = VisualTransformation.None, interactionSource = interactionSource, contentPadding = TextFieldDefaults.textFieldWithLabelPadding(start = 4.dp), label = { Text(text = data.label) }, // 关键修改2:显式传递焦点状态给DecorationBox,确保label浮动逻辑触发 hasFocus = isFocused ) } } }
为什么这样能解决问题?
- 当
BasicTextField获得焦点时,interactionSource会捕获到这个状态变化,isFocused会同步变为true。 - 把
isFocused传给TextFieldDecorationBox的hasFocus参数后,它会触发内置的label浮动逻辑——即使输入内容为空,只要组件聚焦,label就会平滑移动到输入框上方。 - 同时,
indicatorLine也能正确同步焦点状态,显示聚焦时的下划线样式,保持UI状态一致。
这样修改后,不管是输入内容还是仅聚焦,label都会正常上移,完全符合你想要的效果。
内容的提问来源于stack exchange,提问作者Marine Droit
相关产品推荐
相关产品推荐

