前言
文本的输入框架本身提供了
BasicTextField
TextField
OutlinedTextField
BasicTextField
是最基本的输入框,没有什么样式,也方便我们自定义,是我们最常用的组件。
后两者有自带的样式和交互效果,但是实际项目中并不符合我们的效果,所以一般很少用。
BasicTextField
基础示例
1 | BasicTextField( |
文本渐变和光标渐变
1 | // @Composable 注解表示该函数可以作为可组合项使用 |
placeholder
默认是不支持placeholder的,我们可以自定义实现。
1 | import androidx.compose.foundation.focusable |
TextField
1 |
|
输入类型为密码
1 |
|
彩虹色文字
1 |
|
OutlinedTextField
1 |
|
收起键盘
1 |
|
两种方式
方式1
1 | // 获取焦点管理器(用于清除焦点) |
方式2
1 | // 可选:获取键盘控制器(用于强制收起键盘) |
核心实现原理
- 焦点管理:通过
LocalFocusManager
获取焦点管理器,调用focusManager.clearFocus()
可清除所有组件的焦点,输入框失去焦点后键盘会自动收起。 - 父布局可点击:将整个屏幕的父布局(如
Box
)设置为clickable
,点击时触发焦点清除操作。 - 事件冒泡:通过
pointerInput(Unit) {}
确保点击事件能从子组件传递到父组件(避免子组件消费事件后父组件无法响应)。 - 可选:强制收起键盘:通过
LocalSoftwareKeyboardController
的hide()
方法可以强制收起键盘,适合某些特殊场景(如焦点清除后键盘未自动收起的情况)。
注意事项
- 确保父布局的
clickable
修饰符作用于整个可点击区域(通常是fillMaxSize()
的容器)。 - 输入框本身的点击事件不会触发父布局的
clickable
(因为事件会被输入框优先消费),这符合预期(点击输入框时应保持焦点并弹出键盘)。 - 此方案适用于所有需要点击空白区域收起键盘的场景(不仅限于
BasicTextField
,也适用于TextField
等输入组件)。
去除涟漪效果
只要组件设置的可点击,就会出现涟漪效果,要想去除涟漪效果,我们可以扩展Modifier
的方法来实现。
1 | import android.annotation.SuppressLint |
使用方法:
把clickable
更换为noRippleClickable
即可。
两种组件封装形式
在对 BasicTextField
进行组件封装时,既可以使用 MutableState
也可以使用回调来在外层获取组件内的值。
下面分别介绍这两种方式的特点和使用场景。
使用 MutableState
原理
通过将 MutableState
对象作为参数传递给封装的 BasicTextField
组件,组件内部直接操作这个 MutableState
的值,由于 MutableState
是引用类型,所以在组件外部也能感知到其值的变化。
示例代码
1 | import androidx.compose.foundation.text.BasicTextField |
优缺点
优点
- 代码简洁:使用
MutableState
可以减少回调函数的使用,使代码逻辑更加清晰。 - 数据流向明确:直接操作状态对象,数据的流动方向一目了然,便于理解和维护。
缺点
- 耦合度较高:组件与外部的状态紧密绑定,降低了组件的独立性和可复用性。
使用回调
原理
定义一个回调函数作为参数传递给封装的 BasicTextField
组件,当组件内部的值发生变化时,调用这个回调函数并将新的值作为参数传递出去。
示例代码
1 | import androidx.compose.foundation.text.BasicTextField |
优缺点
优点
- 解耦性强:组件与外部的耦合度较低,组件只负责触发回调,不关心外部如何处理数据,提高了组件的可复用性。
- 灵活性高:可以根据需要在回调函数中添加更多的逻辑,比如数据验证、格式化等。
缺点
- 代码复杂度增加:需要定义和管理回调函数,增加了代码的复杂度。
选择建议
使用
MutableState
的场景:当组件与外部的交互比较简单,且数据流向比较明确时,使用MutableState
可以使代码更加简洁。例如,组件只是简单地修改一个状态值,而不需要进行额外的逻辑处理。
使用回调的场景:当组件需要与外部进行复杂的交互,或者需要在值变化时执行一些额外的逻辑时,使用回调可以提高组件的灵活性和可复用性。
例如,在值变化时需要进行数据验证、发送网络请求等操作。