|
| 1 | +# TextField |
| 2 | + |
| 3 | +`TextField` 是 Miuix 中的基础输入组件,用于接收用户的文本输入。组件提供了丰富的自定义选项,支持标签动画、前置和后置图标等功能。 |
| 4 | + |
| 5 | +## 引入 |
| 6 | + |
| 7 | +```kotlin |
| 8 | +import top.yukonga.miuix.kmp.basic.TextField |
| 9 | +``` |
| 10 | + |
| 11 | +## 基本用法 |
| 12 | + |
| 13 | +TextField 组件可以用于获取用户输入: |
| 14 | + |
| 15 | +```kotlin |
| 16 | +var text by remember { mutableStateOf("") } |
| 17 | +TextField( |
| 18 | + value = text, |
| 19 | + onValueChange = { text = it }, |
| 20 | + label = "用户名" |
| 21 | +) |
| 22 | +``` |
| 23 | + |
| 24 | +## 输入框类型 |
| 25 | + |
| 26 | +### 带标签输入框 |
| 27 | + |
| 28 | +标签会在输入框获得焦点或有内容时自动移动到顶部: |
| 29 | + |
| 30 | +```kotlin |
| 31 | +var text by remember { mutableStateOf("") } |
| 32 | +TextField( |
| 33 | + value = text, |
| 34 | + onValueChange = { text = it }, |
| 35 | + label = "邮箱地址" |
| 36 | +) |
| 37 | +``` |
| 38 | + |
| 39 | +### 使用标签作为占位符 |
| 40 | + |
| 41 | +```kotlin |
| 42 | +var text by remember { mutableStateOf("") } |
| 43 | +TextField( |
| 44 | + value = text, |
| 45 | + onValueChange = { text = it }, |
| 46 | + label = "请输入内容", |
| 47 | + useLabelAsPlaceholder = true |
| 48 | +) |
| 49 | +``` |
| 50 | + |
| 51 | +### 禁用状态 |
| 52 | + |
| 53 | +```kotlin |
| 54 | +var text by remember { mutableStateOf("") } |
| 55 | +TextField( |
| 56 | + value = text, |
| 57 | + onValueChange = { text = it }, |
| 58 | + label = "禁用输入框", |
| 59 | + enabled = false |
| 60 | +) |
| 61 | +``` |
| 62 | + |
| 63 | +### 只读状态 |
| 64 | + |
| 65 | +```kotlin |
| 66 | +var text by remember { mutableStateOf("这是只读内容") } |
| 67 | +TextField( |
| 68 | + value = text, |
| 69 | + onValueChange = { text = it }, |
| 70 | + label = "只读输入框", |
| 71 | + readOnly = true |
| 72 | +) |
| 73 | +``` |
| 74 | + |
| 75 | +## 属性 |
| 76 | + |
| 77 | +### TextField 属性 |
| 78 | + |
| 79 | +| 属性名 | 类型 | 默认值 | 说明 | |
| 80 | +| --------------------- | -------------------------------------------- | ---------------------------------------------------- | ---------------------- | |
| 81 | +| value | String 或 TextFieldValue | - | 输入框的文本值 | |
| 82 | +| onValueChange | (String) -> Unit 或 (TextFieldValue) -> Unit | - | 文本变化时的回调函数 | |
| 83 | +| modifier | Modifier | Modifier | 应用于输入框的修饰符 | |
| 84 | +| insideMargin | DpSize | DpSize(16.dp, 16.dp) | 输入框内部边距 | |
| 85 | +| backgroundColor | Color | MiuixTheme.colorScheme.secondaryContainer | 输入框背景颜色 | |
| 86 | +| cornerRadius | Dp | 16.dp | 输入框圆角半径 | |
| 87 | +| label | String | "" | 输入框标签文本 | |
| 88 | +| labelColor | Color | MiuixTheme.colorScheme.onSecondaryContainer | 标签文本颜色 | |
| 89 | +| useLabelAsPlaceholder | Boolean | false | 是否使用标签作为占位符 | |
| 90 | +| enabled | Boolean | true | 输入框是否可用 | |
| 91 | +| readOnly | Boolean | false | 输入框是否只读 | |
| 92 | +| textStyle | TextStyle | MiuixTheme.textStyles.main | 输入文本样式 | |
| 93 | +| keyboardOptions | KeyboardOptions | KeyboardOptions.Default | 键盘选项配置 | |
| 94 | +| keyboardActions | KeyboardActions | KeyboardActions.Default | 键盘操作配置 | |
| 95 | +| leadingIcon | @Composable (() -> Unit)? | null | 前置图标 | |
| 96 | +| trailingIcon | @Composable (() -> Unit)? | null | 后置图标 | |
| 97 | +| singleLine | Boolean | false | 是否为单行输入 | |
| 98 | +| maxLines | Int | 如果 singleLine 为 true 则为 1,否则为 Int.MAX_VALUE | 最大行数 | |
| 99 | +| minLines | Int | 1 | 最小行数 | |
| 100 | +| visualTransformation | VisualTransformation | VisualTransformation.None | 视觉转换器 | |
| 101 | +| onTextLayout | (TextLayoutResult) -> Unit | {} | 文本布局变化回调 | |
| 102 | +| interactionSource | MutableInteractionSource? | null | 交互源 | |
| 103 | + |
| 104 | +## 进阶用法 |
| 105 | + |
| 106 | +### 带图标输入框 |
| 107 | + |
| 108 | +```kotlin |
| 109 | +var text by remember { mutableStateOf("") } |
| 110 | +TextField( |
| 111 | + value = text, |
| 112 | + onValueChange = { text = it }, |
| 113 | + label = "搜索", |
| 114 | + leadingIcon = { |
| 115 | + Icon( |
| 116 | + imageVector = MiuixIcons.Useful.Search, |
| 117 | + contentDescription = "搜索图标", |
| 118 | + modifier = Modifier.padding(horizontal = 12.dp) |
| 119 | + ) |
| 120 | + } |
| 121 | +) |
| 122 | +``` |
| 123 | + |
| 124 | +### 密码输入框 |
| 125 | + |
| 126 | +```kotlin |
| 127 | +var password by remember { mutableStateOf("") } |
| 128 | +var passwordVisible by remember { mutableStateOf(false) } |
| 129 | +TextField( |
| 130 | + value = password, |
| 131 | + onValueChange = { password = it }, |
| 132 | + label = "密码", |
| 133 | + visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(), |
| 134 | + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), |
| 135 | + trailingIcon = { |
| 136 | + IconButton( |
| 137 | + onClick = { passwordVisible = !passwordVisible }, |
| 138 | + modifier = Modifier.padding(end = 12.dp) |
| 139 | + ) { |
| 140 | + Icon( |
| 141 | + imageVector = MiuixIcons.Useful.Rename, |
| 142 | + tint = if (passwordVisible) MiuixTheme.colorScheme.primary else MiuixTheme.colorScheme.onSecondaryContainer, |
| 143 | + contentDescription = if (passwordVisible) "隐藏密码" else "显示密码" |
| 144 | + ) |
| 145 | + } |
| 146 | + } |
| 147 | +) |
| 148 | +``` |
| 149 | + |
| 150 | +### 带验证的输入框 |
| 151 | + |
| 152 | +```kotlin |
| 153 | +var email by remember { mutableStateOf("") } |
| 154 | +var isError by remember { mutableStateOf(false) } |
| 155 | +var errorColor = Color.Red.copy(0.3f) |
| 156 | +val emailPattern = remember { Regex("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+") } |
| 157 | +Column { |
| 158 | + TextField( |
| 159 | + value = email, |
| 160 | + onValueChange = { |
| 161 | + email = it |
| 162 | + isError = email.isNotEmpty() && !emailPattern.matches(email) |
| 163 | + }, |
| 164 | + label = "电子邮箱", |
| 165 | + labelColor = if (isError) errorColor else MiuixTheme.colorScheme.onSecondaryContainer, |
| 166 | + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email) |
| 167 | + ) |
| 168 | + if (isError) { |
| 169 | + Text( |
| 170 | + text = "请输入有效的邮箱地址", |
| 171 | + color = errorColor, |
| 172 | + style = MiuixTheme.textStyles.body2, |
| 173 | + modifier = Modifier.padding(start = 16.dp, top = 4.dp) |
| 174 | + ) |
| 175 | + } |
| 176 | +} |
| 177 | +``` |
| 178 | + |
| 179 | +### 自定义样式 |
| 180 | + |
| 181 | +```kotlin |
| 182 | +var text by remember { mutableStateOf("") } |
| 183 | +TextField( |
| 184 | + value = text, |
| 185 | + onValueChange = { text = it }, |
| 186 | + label = "自定义输入框", |
| 187 | + cornerRadius = 8.dp, |
| 188 | + backgroundColor = MiuixTheme.colorScheme.primary.copy(alpha = 0.1f), |
| 189 | + textStyle = TextStyle( |
| 190 | + fontWeight = FontWeight.Medium, |
| 191 | + fontSize = 16.sp, |
| 192 | + color = MiuixTheme.colorScheme.primary |
| 193 | + ) |
| 194 | +) |
| 195 | +``` |
| 196 | + |
| 197 | +### 使用 TextFieldValue |
| 198 | + |
| 199 | +当需要更细致地控制文本选择和光标位置时: |
| 200 | + |
| 201 | +```kotlin |
| 202 | +var textFieldValue by remember { mutableStateOf(TextFieldValue("")) } |
| 203 | +TextField( |
| 204 | + value = textFieldValue, |
| 205 | + onValueChange = { textFieldValue = it }, |
| 206 | + label = "高级输入控制", |
| 207 | + // TextFieldValue 提供了对文本、选择范围和光标位置的控制 |
| 208 | +) |
| 209 | +``` |
0 commit comments