Flutter之基础Widget之TextField
- Flutter和Dart系列文章
- 项目GitHub地址
- 上一篇Flutter之基础Widget文章介绍了
Flutter
中基础的Widget
, 但是由于篇幅的原因, 这篇文章就主要介绍TextField
TextField
TextField
用于文本输入,它提供了很多属性,我们先简单介绍一下主要属性的作用
1 | const TextField({ |
controller
- 编辑框的控制器,通过它可以设置/获取编辑框的内容、选择编辑内容、监听编辑文本改变事件
- 大多数情况下我们都需要显式提供一个
controller
来与文本框交互 - 如果没有提供
controller
,则TextField
内部会自动创建一个 - 下面是一个
TextField
的取值和赋值的操作
1 | class TextFieldWidget extends StatefulWidget { |
focusNode
用于控制TextField
是否占有当前键盘的输入焦点, 使我们和键盘交互的handle
1 | FocusNode focusNode1 = new FocusNode(); |
decoration
用于控制TextField
的外观显示,如提示文本、背景颜色、边框等, 下面是InputDecoration
的构造方法
1 | const InputDecoration({ |
keyboardType
用于设置该输入框默认的键盘输入类型,取值如下:
1 | keyboardType: TextInputType.number, |
TextInputType |
含义 |
---|---|
text |
文本输入键盘 |
multiline |
多行文本,需和maxLines 配合使用(设为null 或大于1) |
number |
纯数字键盘 |
phone |
电话号码输入键盘会弹出数字键盘并显示* # |
datetime |
日期输入键盘, Android 上会显示: - |
emailAddress |
电子邮件地址,会显示@ . |
url |
连接输入键盘, 会显示/ . |
textInputAction
决定键盘右下角按钮显示的内容, TextInputAction
枚举值
textInputAction |
样式 |
---|---|
none |
不支持iOS |
unspecified |
显示return |
done |
显示Done |
go |
显示Go |
search |
显示Search |
send |
显示Send |
next |
显示Next |
previous |
不支持iOS |
continueAction |
显示Continue |
join |
显示Join |
route |
显示Route |
emergencyCall |
显示Emergency Call |
newline |
textCapitalization
设置什么状态下使用大写字母键盘TextCapitalization
枚举值
1 | enum TextCapitalization { |
textAlign
输入框内文本在水平方向的对齐方式
1 | // 默认值 |
textDirection
决定文本是从右向左对其还是从左向右对齐
1 | enum TextDirection { |
inputFormatters
- 用于限制输入的内容,接收一个
TextInputFormatter
类型的集合 TextInputFormatter
是一个抽象类, 官方给我们提供了他的三个子类,分别是WhitelistingTextInputFormatter
: 白名单校验,也就是只允许输入符合规则的字符BlacklistingTextInputFormatter
: 黑名单校验,除了规定的字符其他的都可以输入LengthLimitingTextInputFormatter
: 长度限制,跟maxLength作用类似
- 构造函数如下
1 | // 白名单校验 |
使用介绍
1 | // 白名单 |
光标设置
设置输入框光标的样式
1 | // 光标的宽度 |
enableInteractiveSelection
长按输入的文本, 设置是否显示剪切,复制,粘贴按钮, 默认是显示的
1 | // 默认值 |
事件监听
1 | // 输入文本发生变化时的回调,参数即为输入框中的值 |
Form
- 实际业务中,在正式向服务器提交数据前,都会对各个输入框数据进行合法性校验,但是对每一个
TextField
都分别进行校验将会是一件很麻烦的事 Flutter
提供了一个表单Form
,它可以对输入框进行分组,然后进行一些统一操作,如输入内容校验、输入框重置以及输入内容保存。Form
继承自StatefulWidget
对象,它对应的状态类为FormState
1 | // Form类的定义 |
FormField
Form
的子元素必须是FormField
类型,FormField
是一个抽象类,FormState
内部通过定义的属性来完成操作,FormField
部分定义如下:
1 | const FormField({ |
TextFormField
为了方便使用,Flutter
提供了一个TextFormField
,它继承自FormField
类,也是TextField
的一个包装类,所以除了FormField
定义的属性之外,它还包括TextField
的属性。
1 | class TextFormField extends FormField<String> { |
FormState
FormState
为Form
的State
类,可以通过Form.of()
或GlobalKey
获得。- 我们可以通过它来对
Form
的子元素FormField
进行统一操作 - 我们看看其常用的三个方法:
1 | // 调用此方法后,会调用Form子元素FormField的save回调,用于保存表单内容 |
需求示例
用户登录示例, 在提交之前校验:
- 用户名不能为空,如果为空则提示“用户名不能为空”。
- 密码不能小于6位,如果小于6为则提示“密码不能少于6位”。
1 | class TextStateWidget extends StatefulWidget { |
好了, 到这里
TextField
相关的知识已经介绍完了, 下一篇应该就是介绍容器类Widget
了, 拭目以待吧