主题
输入框
TextField
属性
dart
const TextField({
...
TextEditingController controller,
FocusNode focusNode,
InputDecoration decoration = const InputDecoration(),
TextInputType keyboardType,
TextInputAction textInputAction,
TextStyle style,
TextAlign textAlign = TextAlign.start,
bool autofocus = false,
bool obscureText = false,
int maxLines = 1,
int maxLength,
this.maxLengthEnforcement,
ToolbarOptions? toolbarOptions,
ValueChanged<String> onChanged,
VoidCallback onEditingComplete,
ValueChanged<String> onSubmitted,
List<TextInputFormatter> inputFormatters,
bool enabled,
this.cursorWidth = 2.0,
this.cursorRadius,
this.cursorColor,
this.onTap,
...
})
controller
:编辑框的控制器,通过它可以设置/获取编辑框的内容、选择编辑内容、监听编辑文本改变事件focusNode
:用于控制TextField
是否占有当前键盘的输入焦点。它是我们和键盘交互的一个句柄InputDecoration
:用于控制TextField
的外观显示,如提示文本、背景颜色、边框等keyboardType
:用于设置该输入框默认的键盘输入类型,取值如下:
TextInputType枚举值 | 含义 |
---|---|
text | 文本输入键盘 |
multiline | 多行文本,需和maxLines配合使用(设为null或大于1) |
number | 数字;会弹出数字键盘 |
phone | 优化后的电话号码输入键盘;会弹出数字键盘并显示“* #” |
datetime | 优化后的日期输入键盘;Android上会显示“: -” |
emailAddress | 优化后的电子邮件地址;会显示“@ .” |
url | 优化后的url输入键盘; 会显示“/ .” |
textInputAction
:键盘动作按钮图标(即回车键位图标),它是一个枚举值,有多个可选值,全部的取值列表读者可以查看API文档,下面是当值为TextInputAction.search
时,原生Android系统下键盘样式
style
:正在编辑的文本样式textAlign
: 输入框内编辑文本在水平方向的对齐方式autofocus
: 是否自动获取焦点obscureText
:是否隐藏正在编辑的文本,如用于输入密码的场景等,文本内容会用“•”替换maxLines
:输入框的最大行数,默认为1;如果为null
,则无行数限制maxLength
和maxLengthEnforcement
:maxLength
代表输入框文本的最大长度,设置后输入框右下角会显示输入的文本计数。maxLengthEnforcement
决定当输入文本长度超过maxLength
时如何处理,如截断、超出等toolbarOptions
:长按或鼠标右击时出现的菜单,包括 copy、cut、paste 以及 selectAllonChange
:输入框内容改变时的回调函数onEditingComplete
和onSubmitted
:这两个回调都是在输入框输入完成时触发,比如按了键盘的完成键(对号图标)或搜索键(🔍图标)。不同的是两个回调签名不同,onSubmitted
回调是ValueChanged<String>
类型,它接收当前输入内容做为参数,而onEditingComplete
不接收参数inputFormatters
:用于指定输入格式;当用户输入内容改变时,会根据指定的格式来校验enable
:如果为false
,则输入框会被禁用,禁用状态不接收输入和事件,同时显示禁用态样式cursorWidth
、cursorRadius
和cursorColor
:这三个属性是用于自定义输入框光标宽度、圆角和颜色的
dart
TextField(
decoration: InputDecoration(
labelText: "用户名",
hintText: "用户名或邮箱",
prefixIcon: Icon(Icons.person)
),
)
监听文本变化并获取输入内容
onChanged
- 定义一个 String 类型的变量
dart
String value = '';
- 设置
onChanged
回调
dart
TextField(
onChanged: (v) {
setState(){
value = v;
};
}
)
controller
- 定义一个
controller
dart
TextEditingController _controller = TextEditingController();
- 设置输入框
dart
TextField(
controller: _controller,
...
)
- 通过 controller 监听
dart
@override
void initState() {
_controller.addListener((){
print(_controller.text);
});
}
- 直接获取文本
dart
print(_controller.text);
两种方式相比,
onChanged
是专门用于监听文本变化,而controller
的功能却多一些,除了能监听文本变化外,它还可以设置默认值、选择文本dart_controller.text = 'hello world'; _controller.selection = TextSelection( baseOffset: 2, extentOffset: _controller.text.length );
焦点
使用 FocusNode
绑定输入框的焦点
使用 FocusScopeNode
管理 widget 树的焦点
dart
class _FocusState extends State<HomePage> {
FocusNode focusNode = FocusNode();
FocusScopeNode? focusScopeNode;
@override
Widget build(BuildContext context) {
return TextField(
decoration: InputDecoration(
labelText: "input",
),
focusNode: focusNode,
);
}
}
输入框获取焦点
dart
ElevatedButton(
onPressed: () {
if (focusScopeNode == null) {
focusScopeNode = FocusScope.of(context);
}
focusScopeNode?.requestFocus(focusNode);
},
child: Text('获取焦点'),
)
失去焦点
dart
ElevatedButton(
onPressed: () => focusNode.unfocus(),
child: Text('失去焦点'),
)
当所有页面编辑框的焦点都失去,键盘会自动收起
监听焦点状态改变
获得焦点时focusNode.hasFocus
值为true
,失去焦点时为false
dart
focusNode.addListener((){
print(focusNode.hasFocus);
});