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

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
            )
        }
    }
}

为什么这样能解决问题?

  1. 当BasicTextField获得焦点时,interactionSource会捕获到这个状态变化,isFocused会同步变为true。
  2. 把isFocused传给TextFieldDecorationBox的hasFocus参数后,它会触发内置的label浮动逻辑——即使输入内容为空,只要组件聚焦,label就会平滑移动到输入框上方。
  3. 同时,indicatorLine也能正确同步焦点状态,显示聚焦时的下划线样式,保持UI状态一致。

这样修改后,不管是输入内容还是仅聚焦,label都会正常上移,完全符合你想要的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:52:43