跳转到内容

CodeTextField

验证码分格输入组件,对应 ColorOS 的 COUICodeInputView:42x46dp 卡片格、8dp 圆角、活动格 1.6dp 主色描边、数字以 0.6 -> 1.0 缩放 + 淡入弹出,并支持以圆点代替数字的安全模式。点击任意位置即可聚焦隐藏输入框;输入从左到右填格,粘贴会把验证码分发到各格,退格清除最后一格。聚焦时活动空格内显示闪烁光标。

引入

kotlin
import io.github.suqi8.coui.kmp.basic.CodeTextField
import io.github.suqi8.coui.kmp.basic.CodeTextFieldDefaults

基本用法

kotlin
var code by remember { mutableStateOf("") }

CodeTextField(
    value = code,
    onValueChange = { code = it.filter(Char::isDigit) },
    onComplete = { submit(it) },
    modifier = Modifier.fillMaxWidth(),
)

安全模式

kotlin
var pin by remember { mutableStateOf("") }

CodeTextField(
    value = pin,
    onValueChange = { pin = it.filter(Char::isDigit) },
    cellCount = 4,
    security = true,
    modifier = Modifier.fillMaxWidth(),
)

组件状态

禁用状态

禁用后组件仍显示当前验证码,但无法聚焦或编辑,光标与活动格描边也会隐藏:

kotlin
CodeTextField(
    value = code,
    onValueChange = { code = it },
    enabled = false,
    modifier = Modifier.fillMaxWidth(),
)

属性

CodeTextField

属性类型说明默认值必需
valueString各格显示的验证码-
onValueChange(String) -> Unit验证码变化时返回净化后文本的回调-
modifierModifier应用于组件的修饰符Modifier
cellCountInt验证码格数CodeTextFieldDefaults.CellCount (6)
enabledBoolean组件是否启用true
securityBoolean是否以圆点代替数字显示false
cellSizeDpSize自适应缩放前单格的尺寸CodeTextFieldDefaults.CellSize
cellCornerRadiusDp单格的圆角CodeTextFieldDefaults.CellCornerRadius
colorsCodeTextFieldColors颜色配置CodeTextFieldDefaults.codeTextFieldColors()
textStyleTextStyle格内数字的文本样式CodeTextFieldDefaults.textStyle()
keyboardOptionsKeyboardOptions隐藏输入框的键盘选项KeyboardOptions(keyboardType = KeyboardType.Number)
onComplete((String) -> Unit)?所有格填满时返回完整验证码的回调null
interactionSourceMutableInteractionSource?交互源null

CodeTextFieldDefaults

常量类型说明默认值
CellCountInt默认格数6
CellSizeDpSize单格尺寸DpSize(42.dp, 46.dp)
CellCornerRadiusDp单格圆角8.dp
MinCellSpacingDp相邻格之间的最小间距4.dp
MaxCellSpacingDp相邻格之间的最大间距16.dp
CellStrokeWidthDp活动格描边宽度1.6.dp
SecurityCircleRadiusDp安全模式圆点半径5.dp
CursorWidthDp闪烁光标宽度2.dp
ReferenceWidthDp触发缩放的参考宽度360.dp

方法

方法名类型说明
textStyle()TextStyle默认数字样式(COUITheme.textStyles.title2 调整为 30sp,coui_code_input_cell_text_size)
codeTextFieldColors()CodeTextFieldColors创建验证码输入框的颜色配置

codeTextFieldColors() 工厂

参数类型默认值
cellBackgroundColorColorCOUITheme.colorScheme.surfaceContainer
textColorColorCOUITheme.colorScheme.onSurface
focusedStrokeColorColorCOUITheme.colorScheme.primary
securityCircleColorColorCOUITheme.colorScheme.onSurface(alpha 0.847)
cursorColorColorCOUITheme.colorScheme.primary

行为

  • onValueChange 始终返回净化后的验证码:去除空白字符并截断到 cellCount
  • 一次插入多个字符(粘贴)会替换整个验证码并分发到各格,对应 COUICodeInputView 的 TextWatcher 行为。
  • 活动格(第一个空格,填满时为最后一格)在聚焦时显示 1.6dp 描边;描边以 100ms(延迟 33ms)淡入、100ms 淡出(COUI move 缓动 0.3, 0, 0.1, 1)。
  • 数字以 0.6 -> 1.0 缩放 + 100ms 淡入出现,删除时延迟 33ms 淡出;安全模式跳过数字动画,与 COUI 一致。
  • 可用宽度低于 360dp 参考宽度时,各格按比例缩小,格间距在 4dp 与 16dp 之间自适应。

进阶用法

自定义单格样式

kotlin
CodeTextField(
    value = code,
    onValueChange = { code = it },
    cellCount = 4,
    cellSize = DpSize(48.dp, 52.dp),
    cellCornerRadius = 12.dp,
    colors = CodeTextFieldDefaults.codeTextFieldColors(
        focusedStrokeColor = COUITheme.colorScheme.secondary,
    ),
    modifier = Modifier.fillMaxWidth(),
)

变更日志

基于 Apache-2.0 许可发布