跳转到内容

InputView

ColorOS「卡片输入」:白卡(12dp 圆角)内包含可选的 16sp 中等字重标题与一个完全无装饰的输入框,计数 / 清除 / 密码按钮位于输入框尾部,10sp 错误提示位于卡片下方。对应 COUICardSingleInputView(单行)与 COUICardMultiInputView(多行,计数位于卡片右下角)。错误提示以 COUI ease 曲线 217ms 淡入 / 283ms 淡出,显示期间输入框播放 COUI 错误抖动。

引入

kotlin
import io.github.suqi8.coui.kmp.basic.InputView
import io.github.suqi8.coui.kmp.basic.InputViewDefaults

基本用法

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

InputView(
    value = nickname,
    onValueChange = { nickname = it },
    title = "Nickname",
    label = "Enter your nickname",
    showCount = true,
    maxCount = 10,
    showClearButton = true,
    errorMessage = if (nickname.contains(' ')) "Nickname cannot contain spaces" else "",
)

多行卡片

设置 singleLine = false 使用 COUICardMultiInputView 形态:计数移动到卡片右下角(12sp),达到上限时以动画切换为错误色:

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

InputView(
    value = signature,
    onValueChange = { signature = it },
    label = "Signature",
    showCount = true,
    maxCount = 100,
    singleLine = false,
)

组件状态

禁用状态

kotlin
InputView(
    value = "Read only value",
    onValueChange = {},
    title = "Nickname",
    enabled = false,
)

属性

InputView

属性类型说明默认值是否必须
valueString输入框的文本值-
onValueChange(String) -> Unit文本变化时的回调函数-
modifierModifier应用于组件的修饰符Modifier
titleString卡片内标题,为空时隐藏""
labelString内部输入框的标签(占位符)""
enabledBoolean组件是否可用true
readOnlyBoolean输入框是否只读false
showCountBoolean显示「当前/上限」计数(需 maxCount > 0)false
maxCountInt最大字符数,0 表示不限0
showClearButtonBoolean聚焦且非空时显示清除按钮false
showPasswordToggleBoolean显示密码可见切换按钮(隐藏时掩码显示)false
errorMessageString卡片下方的错误提示,为空时隐藏""
cornerRadiusDp卡片圆角半径InputViewDefaults.CornerRadius
colorsInputViewColors卡片、标题、计数与错误提示的颜色InputViewDefaults.inputViewColors()
textFieldColorsTextFieldColors内部输入框的颜色TextFieldDefaults.textFieldColors()
textStyleTextStyle输入文本样式TextFieldDefaults.textStyle(TextFieldMode.None)
keyboardOptionsKeyboardOptions键盘选项配置KeyboardOptions.Default
keyboardActionsKeyboardActions键盘操作配置KeyboardActions.Default
singleLineBoolean单行卡片(true)或多行卡片(false)true
maxLinesInt最大行数singleLine 为 true 时 1,否则 5
visualTransformationVisualTransformation视觉转换器VisualTransformation.None
leadingIcon@Composable (() -> Unit)?前置图标null
trailingIcon@Composable (() -> Unit)?后置图标,位于内置按钮之后null
interactionSourceMutableInteractionSource?交互源null

InputViewDefaults

常量类型说明默认值
CornerRadiusDp卡片圆角半径(couiRoundCornerM)12.dp
ContentPaddingDp卡片内容水平内边距16.dp
TitlePaddingTopDp标题顶部内边距12.dp
TitlePaddingBottomDp标题底部内边距4.dp
TitleMinHeightDp标题最小高度22.dp
FieldPaddingVerticalDp无标题时输入区垂直内边距15.dp
FieldPaddingBottomWithTitleDp有标题时输入区底部内边距(顶部为 0)12.dp
MultiFieldPaddingDp多行卡片输入区垂直内边距13.dp
MultiCountSpacingDp多行输入区与计数之间的间距4.dp
MultiCountMarginBottomDp多行计数底部外边距12.dp
MultiCountFontSizeTextUnit多行计数字号12.sp
CountFontSizeTextUnit单行行内计数字号10.sp
ErrorFontSizeTextUnit错误提示字号10.sp
ErrorPaddingTopDp错误提示顶部内边距4.dp
MaxLinesInt默认最大行数5

titleTextStyle() 返回默认标题样式(16sp、中等字重,COUI couiTextAppearanceHeadline6)。

inputViewColors() 工厂

参数类型默认值
cardColorColorCOUITheme.colorScheme.surfaceContainer
titleColorColorCOUITheme.colorScheme.onSurface
disabledTitleColorColorCOUITheme.colorScheme.disabledOnSurface
countColorColorCOUITheme.colorScheme.onSurfaceVariantActions
errorColorColorCOUITheme.colorScheme.error

行为

  • 内部输入框完全无装饰(TextFieldMode.None,COUIEditText MODE_BACKGROUND_NO_LINE)——无下划线也无描边,与 ColorOS 设置的卡片输入一致。
  • maxCount > 0 时输入被硬性限制在上限内;计数(如显示)为 当前/上限,达到上限时以 250ms 动画切换为错误色(同 COUICardMultiInputView)。
  • 设置非空 errorMessage 时在卡片下方显示提示(217ms 淡入 / 283ms 淡出,COUI ease 0.33, 0, 0.67, 1),同时输入框播放 COUI 错误抖动。淡出过程中保留最后一条非空消息。
  • 输入区内边距对齐 COUICardSingleInputView:无标题上下各 15dp;有标题时顶部 0dp、底部 12dp;多行卡片为 13dp。

进阶用法

带验证的密码输入

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

InputView(
    value = password,
    onValueChange = { password = it },
    title = "Password",
    label = "At least 8 characters",
    showPasswordToggle = true,
    errorMessage = if (password.isNotEmpty() && password.length < 8) "Password is too short" else "",
    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
)

变更日志

基于 Apache-2.0 许可发布