前言
文本的输入框架本身提供了
BasicTextField
TextField
OutlinedTextField
BasicTextField是最基本的输入框,没有什么样式,也方便我们自定义,是我们最常用的组件。
后两者有自带的样式和交互效果,但是实际项目中并不符合我们的效果,所以一般很少用。
BasicTextField
基础示例
1 | BasicTextField( |
密码输入
1 | BasicTextField( |
其中
visualTransformation = VisualTransformation.None显示输入字符visualTransformation = PasswordVisualTransformation()输入字符显示为密文形式
文本渐变和光标渐变
1 | // @Composable 注解表示该函数可以作为可组合项使用 |
placeholder
默认是不支持placeholder的,我们可以自定义实现。
1 | import androidx.compose.foundation.focusable |
TextField
1 |
|
输入类型为密码
1 |
|
彩虹色文字
1 |
|
OutlinedTextField
1 |
|
去除涟漪效果
只要组件设置的可点击,就会出现涟漪效果,要想去除涟漪效果,我们可以扩展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可以使代码更加简洁。例如,组件只是简单地修改一个状态值,而不需要进行额外的逻辑处理。
使用回调的场景:当组件需要与外部进行复杂的交互,或者需要在值变化时执行一些额外的逻辑时,使用回调可以提高组件的灵活性和可复用性。
例如,在值变化时需要进行数据验证、发送网络请求等操作。