flutter第八篇:表单
文本框
TextField表示文本框,默认只有底部边框,如果想变成四边形的框,需要利用其decoration属性,指定其值为InputDecoration实例,指定InputDecoration的border属性值为OutlineInputBorder()。如果想去掉所有边框,则需要把border指定为InputBorder.none。
如果想让文本框有初始值,则需要利用TextField的controller属性,controller属性是个TextEditingController实例,通过其text属性指定文本框里的初始值。如果想让文本在竖直方向上居中,则需要设置InputDecoration的contentPadding属性,上下都设为0。但是在外部容器高度较小时(小于48),即使设置了contentPadding,也不会居中。因为TextField的高度固定是48,当用Container限制其高度,在Container高度小于48时,TextField的高度等于Container的高度,在Container的高度大于48时,TextField的高度还是48。当TextField高度小于48时,用contentPadding就实现不了居中了。此时需要干掉这个默认高度,设置InputDecoration的isCollapsed属性值为true即可,isCollapsed表示收缩。
如果想要有placeholder,则需利用InputDecoration的hintText属性。如果想修改hintText的字体大小、颜色等,需要设置InputDecoration的hintTextStyle属性,在TextStyle中设置fontSize、fontWeight等。如果想在hintText前面加个图标,需要设置InputDecoration的prefixIcon属性。如果想在TextField前面放个图标,则可以用InputDecoration的icon属性。prefixIcon属性和icon属性的区别在于,前者是在TextField内部的,而后者是在TextField外部的。如果想给TextField设置背景颜色,则需要先设置InputDecoration的filled属性为true,再设置fillColor属性即可。
如果想让文字在水平方向上居中,则需要设置textAlign为TextAlign.center,默认从最左侧开始。
如果想调整文本框的字体大小,则需要设置TextField的style属性,在TextStyle中设置fontSize、fontWeight等。
如果想一进入页面就让TextField获得焦点并唤起键盘,则需要设置其autoFocus属性值为true。如果想唤起键盘时键盘上只有数字,则需要把keyboardType设置为TextInputType.number(但其实此时键盘上还有一些标点符号)。keyboardType值还有很多,如TextInputType.phone、TextInputType.emailAddress、TextInputType.text、TextInputType.multiline等,适用于不同的场景。如果想限制只能输入数字,则需要设置inputFormatters为[FilteringTextInputFormatter.allow(RegExp(r'[0-9]'))]。如果想收起键盘,则需要调用FocusManager.instance.primaryFocus?.unfocus()。当键盘弹出和收起时,如果build()方法中有调用MediaQuery.of(context)的话,会造成rebuild,浪费时间与性能,而使用MediaQuery.xxxOf()则不会,所以建议使用这种方式。如果想把光标往后切,则需要调用FocusScope.of(context).nextFocus(),如果想把光标往前切,则需要调用FocusScope.of(context).previousFocus()。
如果想限制文字的最大长度,则需要设置maxLength属性。设置了maxLength属性后,在文本框右下角会有型如"1/11"的计数提示,如果想自定义此计数提示,则需要设置InputDecoration的counterText属性。计数提示会把placeholder顶上去,使得其看起来不在文本框的正中间,所以可以手动去掉计数提示,把counterText设置空字符串即可。
TextField默认是一行,文字多的话就展示不出来,需要手动往右移动光标才能看见。如果想展示多行,则可以设置maxLines的值,如设置为2,则可以展示2行。展示2行的意思是说在任一时间,文本框只能露出两行文字,其他文字需要手动上下移动光标才能看见,文字是不会丢的。maxLines默认值是1,即如果想不限制行数,不设置maxLines不行,需要设置为null。
如果想把普通输入框升级成密码输入框,则需要设置obscureText属性为true。
如果想在文本框左下角展示一些文字,则可以用InputDecoration的helperText属性。
如果想在左上角边框上展示一些文字,则可以用InputDecoration的labelText属性。
如果想禁用文本框的输入,则需要设置enabled属性为false,此时文本框将无法获得焦点,进而无法输入。
利用TextField的onChange属性可以拿到文本框中的内容,每当文本框的内容变化时,都能拿到最新的内容。onChange属性值是一个函数,入参即是文本框的内容。
利用TextField的onSubmitted属性,在点击虚拟键盘的回车后,可以拿到文本框的内容。onSubmitted属性值是一个函数,点击回车就会触发此函数执行,入参即是文本框的内容。
单选框、复选框
单选框用radio、radioListTile组件,复选框用checkbox、checkboxListTile组件。radio就是一个单选框,不包含框前面的文本,文本需要Text。 而radioListTile可以利用其title属性放文本。radioListTile独占一行,文本和复选框两边对齐。多个radioListTile放在一个Row中会报错。checkbox、checkboxListTile同理。
浙公网安备 33010602011771号